1:運作程式報the file couldn't be opened because you don't have permission to view it
解決辦法:項目—>targets->build settings->build options->changed the value of the "Compiler for C/C++/Objective-C" to Default Compiler.
2:百度地圖引用
1.1如圖引用的是.framework形式開發包時,引入的命名空間則是
#import <BaiduMapAPI/BMapKit.h>//引入所有的頭檔案
#import <BaiduMapAPI/BMKMapView.h>//隻引入所需的單個頭檔案
如果是引入用的是.a形式開發包時,引入的命名空間則是
#import “BMapKit.h"
1.2百度地圖現在提供的兩個.framework的包,一個是真機一個是測試機,可以使用終端的指令把它合成一個;
3:自定義大頭針百度地圖
- (void)viewDidLoad {
[super viewDidLoad];
//百度地圖初始化
_mapView=[[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-NAVBARHEIGHT)];
_mapView.delegate=self;
[self.view addSubview:_mapView];
//标出坐标點
[self addPointAnnotation];
}
//添加标注
- (void)addPointAnnotation
{
for (int i=0; i<self.coordinates.count; i++) {
coordinateBean *model=self.coordinates[i];
BMKPointAnnotation* pointAnnotation = [[BMKPointAnnotation alloc]init];
CLLocationCoordinate2D coor;
coor.latitude = model.latitude;
coor.longitude = model.longitude;
pointAnnotation.coordinate = coor;
//通過title來起到傳值的作用
pointAnnotation.title=[NSString stringWithFormat:@"%d",i];
[_mapView addAnnotation:pointAnnotation];
//顯示彈出窗
[_mapView selectAnnotation:pointAnnotation animated:YES];
//判斷那個是中心,沒有則0必傳參數
if (i==self.selectIndex) {
BMKCoordinateRegion region; ////表示範圍的結構體
region.center.latitude = model.latitude;// 中心中
region.center.longitude = model.longitude;
region.span.latitudeDelta = 0;//經度範圍(設定為0.1表示顯示範圍為0.2的緯度範圍)
region.span.longitudeDelta = 0;//緯度範圍
[_mapView setRegion:region];
}
}
}
//處理自定義彈出視圖
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
{
if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myrenameMark"];
newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
newAnnotationView.animatesDrop = YES;// 設定該标注點動畫顯示
newAnnotationView.image = [UIImage imageNamed:self.mapPointImageName]; //把大頭針換成别的圖檔
int selectIndex=[((BMKPointAnnotation *)annotation).title intValue];
//獲得值
coordinateBean *model=[self.coordinates objectAtIndex:[((BMKPointAnnotation *)annotation).title intValue]];
UIView *popView=[[UIView alloc]initWithFrame:CGRectMake(0, 3, 100, 20)];
UIImage *img=[UIImage imageNamed:@"mapViewBackground"];
UIEdgeInsets edge=UIEdgeInsetsMake(0, 20, 0, 10);
img=[img resizableImageWithCapInsets:edge resizingMode:UIImageResizingModeStretch];
UIImageView *myimage=[[UIImageView alloc] initWithImage:img];
myimage.frame=CGRectMake(30, 0, 100, 40);
myimage.userInteractionEnabled=YES;
[popView addSubview:myimage];
//自定義顯示的内容
UILabel *driverName = [[UILabel alloc]initWithFrame:CGRectMake(0, 3, 100, 15)];
driverName.backgroundColor=[UIColor clearColor];
driverName.text=model.title;
driverName.font = [UIFont systemFontOfSize:12];
driverName.textColor = [UIColor blackColor];
driverName.textAlignment = NSTextAlignmentLeft;
[myimage addSubview:driverName];
UILabel *carName = [[UILabel alloc]initWithFrame:CGRectMake(0, 18, 100, 15)];
carName.backgroundColor=[UIColor clearColor];
carName.text=model.comments;
carName.font = [UIFont systemFontOfSize:12];
carName.textColor = [UIColor blackColor];
carName.textAlignment = NSTextAlignmentLeft;
[myimage addSubview:carName];
BMKActionPaopaoView *pView = [[BMKActionPaopaoView alloc]initWithCustomView:popView];
pView.frame = CGRectMake(0, 0, 100, 40);
((BMKPinAnnotationView*)newAnnotationView).paopaoView = nil;
((BMKPinAnnotationView*)newAnnotationView).paopaoView = pView;
newAnnotationView.tag=selectIndex+10;
return newAnnotationView;
}
return nil;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/**
* @author wujunyang, 15-05-12 13:05:05
*
* @brief 跟對百度地圖的處理
* @param animated <#animated description#>
*/
-(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate=self;
_locationService.delegate=self;
}
/**
* @author wujunyang, 15-01-06 10:01:53
*
* 跟對百度地圖的處理
*
* @param animated <#animated description#>
*/
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate=nil;
_locationService.delegate=nil;
}
其中有個自定義model:
@interface coordinateBean : NSObject
//緯度
@property(assign,nonatomic)float latitude;
//經度
@property(assign,nonatomic)float longitude;
//标題
@property(strong,nonatomic)NSString *title;
//注解
@property(strong,nonatomic)NSString *comments;
@end
4:自動隐藏和顯示工具欄和導覽列
toolbar屬性、toolbarItems與上一講的navigationBar、navigationItem類似。隻不過toolbarItems沒有navigationItem的左右區分,它就自己一個人在做事,相當于沒有下屬。可以在toolbar上設定很多,比如背景顔色、背景圖檔、背景樣式、大小位置(不過有些貌似設定無效),當然和navigationBar一樣,對于它的是否顯示和隐藏是由它的老爸即navigationController控制的。
是以[self.navigationController setNavigationBarHidden:YES animated:YES];也會把底部的toolBarItems給隐藏起來,如果要隐藏導航又不想底部toolBarItems被隐藏掉,可以用普通的view替代toolBarItems;
首先在viewDidLoad裡設定toolBarHidden = NO, 預設是YES(隐藏的)
為了讓toolbar顯示,需要設定為NO(不隐藏)。
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"隐藏導航欄";
// self.toolbarItems
self.navigationController.toolbar.barStyle = self.toolBar.barStyle;
self.navigationController.toolbarHidden = NO;
[self.navigationController.toolbar setTranslucent:YES];
self.toolbarItems = [[[NSMutableArray alloc] initWithArray:self.toolBar.items] autorelease];
}
在點選中間button的時候的顯示和隐藏navigation bar和toolBar
實作代碼如下:
- (IBAction)toggleNavigationBar:(id)sender
{
//Check the current state of the navigation bar...
BOOL navBarState = [self.navigationController isNavigationBarHidden];
//Set the navigationBarHidden to the opposite of the current state.
[self.navigationController setNavigationBarHidden:!navBarState animated:YES];
[self.navigationController setToolbarHidden:!navBarState animated:YES];
//Change the label on the button.
if (navBarState)
{
[button setTitle:@"隐藏 Navigationr and toolbar" forState:UIControlStateNormal];
[button setTitle:@"隐藏 Navigation Bar toolbar" forState:UIControlStateHighlighted];
}
else
{
[button setTitle:@"顯示 Navigation Bar toolbar" forState:UIControlStateNormal];
[button setTitle:@"顯示 Navigation Bar toolbar" forState:UIControlStateHighlighted];
}
}
5:View代碼結構的一些建議
在viewDidload裡面隻做addSubview的事情,然後在viewWillAppear裡面做布局的事情,最後在viewDidAppear裡面做Notification的監聽之類的事情。至于屬性的初始化,則交給getter去做。
@interface CustomObject()
@property (nonatomic, strong) UILabel *label;
@end
@implement
#pragma mark - life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view addSubview:self.label];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.label.frame = CGRectMake(1, 2, 3, 4);
}
#pragma mark - getters and setters
- (UILabel *)label
{
if (_label == nil) {
_label = [[UILabel alloc] init];
_label.text = @"1234";
_label.font = [UIFont systemFontOfSize:12];
... ...
}
return label;
}
@end
注意:*重點,在get方法裡面不能寫self.noLabel;千萬不要用“點”文法,這樣會造成get方法死循環,因為“點”文法就是調用的get方法,是以要用下劃線屬性名的方法得到對象(在記憶體這其實是一個指針)。
@interface MasonryViewController ()
@property(nonatomic,strong)UIView *conView;
@property(nonatomic,assign)int intstate;
@end
@implementation MasonryViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.conView];
}
//懶加載
-(UIView *)conView
{
if(_conView==nil)
{
_conView=[[UIView alloc]init];
_conView.backgroundColor=[UIColor redColor];
}
return _conView;
}
-(int)intstate
{
_intstate=0;
return _intstate;
}
//布局限制
-(void)viewDidLayoutSubviews
{
[self.conView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view.mas_top).with.offset(100);
make.left.equalTo(self.view.mas_left).with.offset(60);
make.right.equalTo(self.view.mas_right).with.offset(0);
make.height.equalTo(@50);
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
6: iOS中的生成随機數方法
生成0-x之間的随機正整數
int value =arc4random_uniform(x + 1);
生成随機正整數
int value = arc4random()
通過arc4random() 擷取0到x-1之間的整數的代碼如下:
int value = arc4random() % x;
擷取1到x之間的整數的代碼如下:
int value = (arc4random() % x) + 1;
最後如果想生成一個浮點數,可以在項目中定義如下宏:
#define ARC4RANDOM_MAX 0x100000000
然後就可以使用arc4random() 來擷取0到100之間浮點數了(精度是rand()的兩倍),代碼如下:
double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
執行個體(從數組中随機顯示出一個背景圖,再通過網絡加載顯示出來):
self.bgView=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)];
self.bgView.image=[UIImage imageNamed:@"AppBg"];
[self.view addSubview:self.bgView];
[self.view sendSubviewToBack:self.bgView];
NSDictionary *params=[[NSDictionary alloc] init];
[[HomeMainNetAPIManager sharedManager] getBackgroundImage:params andBlock:^(id data, NSError *error) {
if (!error&&data) {
BackgroundImageBean *groundImagebean =(BackgroundImageBean *)data;
int dataNum=groundImagebean.data.count;
if (groundImagebean.data&&dataNum>0) {
int r=arc4random_uniform(dataNum);
GroundImageBean *curBean=groundImagebean.data[r];
[self.bgView sd_setImageWithURL:[NSURL URLWithString:curBean.ImgUrl] placeholderImage:[UIImage imageNamed:@"AppBg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
dispatch_async(dispatch_get_main_queue(), ^{
self.bgView.image=image;
});
}];
}
}
}];
7:沙盒路徑知識整理
模拟器的路徑從之前的~/Library/Application Support/iPhone Simulator移動到了~/Library/Developer/CoreSimulator/Devices/
檔案都在個人使用者名檔案夾下的一個隐藏檔案夾裡,中文叫資源庫,他的目錄其實是Library。
因為應用是在沙箱(sandbox)中的,在檔案讀寫權限上受到限制,隻能在幾個目錄下讀寫檔案:
Documents:應用中使用者資料可以放在這裡,iTunes備份和恢複的時候會包括此目錄
tmp:存放臨時檔案,iTunes不會備份和恢複此目錄,此目錄下檔案可能會在應用退出後删除
Library/Caches:存放緩存檔案,iTunes不會備份此目錄,此目錄下檔案不會在應用退出删除
iTunes在與iPhone同步時,備份所有的Documents和Library檔案。
iPhone在重新開機時,會丢棄所有的tmp檔案。
檢視方法:
方法1、可以設定顯示隐藏檔案,然後在Finder下直接打開。設定檢視隐藏檔案的方法如下:打開終端,輸入命名
(1)顯示Mac隐藏檔案的指令:defaults write com.apple.finder AppleShowAllFiles -bool true
(2)隐藏Mac隐藏檔案的指令:defaults write com.apple.finder AppleShowAllFiles -bool false
(3)輸完單擊Enter鍵,退出終端,重新啟動Finder就可以了 重新開機Finder:滑鼠單擊視窗左上角的蘋果标志-->強制退出-->Finder-->
現在能看到資源庫檔案夾了。
打開資源庫後找到/Application Support/iPhone Simulator/檔案夾。這裡面就是模拟器的各個程式的沙盒目錄了。
方法2、這種方法更友善,在Finder上點->前往->前往檔案夾,輸入/Users/username/Library/Application Support/iPhone Simulator/ 前往。
username這裡寫使用者名。
自定義類傳回各目錄路徑:
#import <Foundation/Foundation.h>
@interface ICSandboxHelper : NSObject
+ (NSString *)homePath; // 程式主目錄,可見子目錄(3個):Documents、Library、tmp
+ (NSString *)appPath; // 程式目錄,不能存任何東西
+ (NSString *)docPath; // 文檔目錄,需要ITUNES同步備份的資料存這裡,可存放使用者資料
+ (NSString *)libPrefPath; // 配置目錄,配置檔案存這裡
+ (NSString *)libCachePath; // 緩存目錄,系統永遠不會删除這裡的檔案,ITUNES會删除
+ (NSString *)tmpPath; // 臨時緩存目錄,APP退出後,系統可能會删除這裡的内容
+ (BOOL)hasLive:(NSString *)path; //判斷目錄是否存在,不存在則建立
實作代碼:
#import "ICSandboxHelper.h"
@implementation ICSandboxHelper
+ (NSString *)homePath{
return NSHomeDirectory();
}
+ (NSString *)appPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
+ (NSString *)docPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [paths objectAtIndex:0];
}
+ (NSString *)libPrefPath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [[paths objectAtIndex:0] stringByAppendingFormat:@"/Preference"];
}
+ (NSString *)libCachePath
{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
return [[paths objectAtIndex:0] stringByAppendingFormat:@"/Caches"];
}
+ (NSString *)tmpPath
{return [NSHomeDirectory() stringByAppendingFormat:@"/tmp"];
}
+ (BOOL)hasLive:(NSString *)path
{
if ( NO == [[NSFileManager defaultManager] fileExistsAtPath:path] )
{
return [[NSFileManager defaultManager] createDirectoryAtPath:path
withIntermediateDirectories:YES
attributes:nil
error:NULL];
}
return NO;
}