IOS开发基础知识--碎片13

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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(inti=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:[BMKPointAnnotationclass]]) {

BMKPinAnnotationView*newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myrenameMark"];

newAnnotationView.pinColor=BMKPinAnnotationColorPurple;

newAnnotationView.animatesDrop= YES;//设置该标注点动画显示newAnnotationView.image= [UIImage imageNamed:self.mapPointImageName];//把大头针换成别的图片intselectIndex=[((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;returnnewAnnotationView;

}returnnil;

}- (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)floatlatitude;//经度@property(assign,nonatomic)floatlongitude;//标题@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.toolbarItemsself.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#pragmamark - 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);

}#pragmamark - getters and setters

- (UILabel *)label

{if(_label ==nil) {

_label=[[UILabel alloc] init];

_label.text=@"1234";

_label.font= [UIFont systemFontOfSize:12];

... ...

}returnlabel;

}

@end

注意:*重点,在get方法里面不能写self.noLabel;千万不要用“点”语法,这样会造成get方法死循环,因为“点”语法就是调用的get方法,所以要用下划线属性名的方法得到对象(在内存这其实是一个指针)。

@interface MasonryViewController ()

@property(nonatomic,strong)UIView*conView;

@property(nonatomic,assign)intintstate;

@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之间的随机正整数intvalue =arc4random_uniform(x +1);

生成随机正整数intvalue =arc4random()

通过arc4random() 获取0到x-1之间的整数的代码如下:intvalue = arc4random() %x;

获取1到x之间的整数的代码如下:intvalue = (arc4random() % x) +1;

最后如果想生成一个浮点数,可以在项目中定义如下宏:#defineARC4RANDOM_MAX 0x100000000然后就可以使用arc4random() 来获取0到100之间浮点数了(精度是rand()的两倍),代码如下:doubleval = 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:paramsandBlock:^(id data, NSError *error) {if(!error&&data) {

BackgroundImageBean*groundImagebean =(BackgroundImageBean *)data;intdataNum=groundImagebean.data.count;if(groundImagebean.data&&dataNum>0) {intr=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/applicationSupport/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 -booltrue(2)隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -boolfalse(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{returnNSHomeDirectory();

}+ (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];

}returnNO;

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航