IOS工作笔记(三)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧!

1.选定ipad支持的方向,如强制横屏等,需要在General——》Deployment Info ——》Device Orientation选择,含义如下:

技术分享

所以要想强制横屏的话,可以点选

技术分享

 

2.UIView中如何添加xib文件?

如新建一个UIView为DocDetailView,那么建的那个xib文件在custom class中class应写成跟UIView名字一样的,这里要写成DocDetailView,而不是默认的UIView。
在.m文件中可以这样加载

 1 -(id)initWithFrame:(CGRect) frame{
 2     self = [super initWithFrame:frame];
 3     if(self){
 4         [self makeDocDetail];
 5     }
 6 }
 7 
 8 -(void) makeDocDetail{
 9     NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"DocDetailView" owner:self options:nil];
10     DocDetailView *docDetail = [views objectAtIndex:0];
11     //最好用下边的,这两个等价
12     DocDetailView *docDetail = [views lastObject];
13     [self addSubView:docDetail];
14 }

 

3.当发生错误

StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStoryboardFile MainStoryboard - perhaps the designated entry point is not set?

原因在于storyboard中的没有一个viewcontroller设置initial scene,需要选择一个view controller作为storyboard的第一个界面。

技术分享

 

4.做注释时,一般用“/**  注释内容  */”,这是为了生成文档时方便。(前边两个*,后边一个*);

 

5.字符串合并。可以看以下代码

1 NSString *str1 = @"Hello ";
2 NSString *str2 = @"World";
3 NSString *str = [str1 stringByAppendingString:str2];

 

6.九宫格的坐标算法,使用for循环处理多个uiview的位置、大小等,最终要实现的效果如下。

技术分享

这是在1个UIView上贴12个小的UIView,每个小UIView上再添加1个UIImageView,UILabel,UIButton.
在处理这12个小UIView的位置时的算法如下:

技术分享

把第一行和第一列分别作为0行,0列。那么每个小UIView的X坐标跟列想关,Y坐标跟行相关,因此只要知道了行号和列号(即该view位于哪行哪列),就能得出其坐标。

 1 int appCount = self.allApps.count;//先获取app的总数,独立出来,方便封装
 2 //allApps为数组,数据为字典
 3 int appShowRow = 3; //定义每行要展示的app数,即使appCount改变,也无需改代码。
 4 
 5 //定义每个小view的大小
 6 int appViewW = 85;
 7 int appViewH = 90;
 8 
 9 //定义每个小view之间间隙的大小
10 int MARGINE_Y = 20;
11 int MARGINE_X = (self.frame.size.width - appShowRow * appViewW)/(appShowRow + 1);
12 
13 for (int i=0; i<appCount; i++) {
14         UIView *appView = [[UIView alloc]init];
15         
16         //行号决定Y值,列号决定X值
17         int rowIndex = i / appShowRow; //行号,注意符号
18         int colIndex = i % appShowRow; //列号,取余
19         
20         int appViewX = 20 + (appViewW + MARGINE_X) * colIndex;
21         int appViewY = 30 + (appViewH + MARGINE_Y) * rowIndex;
22         
23         [appView setFrame:CGRectMake(appViewX, appViewY, appViewW, appViewH)];
24 
25         //往view添加图片,此时imageView的父view是小的view,而不是最大的view
26         NSDictionary *appInfo = self.allApps[i];
27 
28         //有了model后,可以这么写
29         //AppModel *appModel = self.allApps[i];
30         //然后相应的appImg和appText就可以改为
31         //appImg.image = [UIImage imageNamed:appModel.img];
32         //appText.text = appModel.label;
33            //appModel的img和label属性要在模型的.h中定义,不能在.m中定义
34         
35         //添加图片,此时图片的位置就是相对于appView,而不是SquaredView
36         UIImageView *appImg = [[UIImageView alloc]init];
37         int appImgW = 45;
38         int appImgH = 45;
39         int appImgX = (appViewW - appImgW) * 0.5;//小view的宽度- imgView的宽度,再除以2
40         int appImgY = 0;
41         
42         appImg.frame = CGRectMake(appImgX, appImgY, appImgW, appImgH);
43         appImg.image = [UIImage imageNamed:appInfo[@"icon"]];
44         [appView addSubview:appImg];
45 
46         //添加UILabel和UIButton的省略
47 
48 
49         [self addSubview:appView]
50 }

 

7.对于一些属性初始化时需要注意,方法名要和属性名一致,在其它方法中调用时只能写成self.xxx,不能写成_xxx,否则调用不到。

_xxx最好只写在相应的get方法内,防止死循环。

 1 @property(nonatomic,strong) NSArray *allApps;
 2 //在其它方法调用时,只能写成self.allApps,不能写成_allApps.如
 3 -(void)drawScrollView{
 4     for(int i=0;i<self.allApps.count,i++){
 5         //其他代码
 6     }
 7 }
 8 
 9 //重写allApps的get方法,方法名要和属性名一致
10 -(NSArray *)allApps{
11     if(_allApps==nil){
12     //if(!_allApps){  //等价
13         //读取plist文件
14         NSString *appPath = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
15         _allApps = [[NSArray alloc]initWithContentsOfFile:appPath];
16     }
17     return _allApps;
18 }

 

8.字典(NSDictionary)转模型(model)

为什么要转?因为字典容易出错。因为设置数据和读取数据都用“字符串”型key,当输错NSString类型数据时,编译器既不会智能提示,也不会报错。

模型都继承自NSObject.如

dict[@"name"] = @"tom";
NSString *name = dict[@"name"];

需要转换为模型,需要实现两个方法。

-(instancetype)initWithDict:(NSDictionary *) dict;
+(instancetype)xxxWithDict:(NSDictionary *) dict;

第二种写法之所以这么写,是因为系统的命名规范。系统中有类似的

NSString stringWithString:(NSString *);
NSDictionary dictionaryWithDictionary:(NSDictionary *);

下面举一个关于模型的例子。模型几乎为固定写法。
.h文件

1 @interface AllApp:NSObject
2 @property (nonatomic, copy) NSString *name;//app名称
3 @property (nonatomic, copy) NSString *icon;//app图标
4 
5 //一般写两种方法,调用哪一种也可以
6 -(instancetype)initWithDict:(NSDictionary *)dict;//属于构造方法
7 +(instancetype)appWithDict:(NSDictionary *)dict; //不是构造方法,工厂方法
8 
9 @end

.m文件中

 1 @implementation AllApp
 2 //构造方法有固定格式,首先必须初始化
 3 -(instancetype)initWithDict:(NSDictionary *)dict{
 4     if(self = [super init]){
 5         self.name = dict[@"name"];
 6         self.icon = dict[@"icon"];
 7     }
 8     return self;
 9 }
10 
11 +(instancetype)appWithDict:(NSDictionary *)dict{
12     return [[self alloc]initWithDict:dict];
13 }
14 
15 @end

然后第7条的初始化方法中可以改为:

 1 -(NSArray *)allApps{
 2     if(_allApps==nil){
 3     //if(!_allApps){ //与上等价
 4         NSString *appPath = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
 5         NSArray *dictArray = [NSArray arrayWithContentOfFile:appPath];
 6 
 7         //将dictArray的所有字典转换成模型对象,放到新的数组中
 8         NSMutableArray *appArray = [NSMutableArray array];
 9         for(NSDictionaty *dict in dictArray){
10             AllApp *app = [AllApp appWithDict:dict];
11             //也可以写成这样
12             //AllApp *app = [[AllApp alloc]initWithDict:dict]];
13             [appArray addObject:app];
14         }
15         _allApps = appArray;
16     }
17     return _allApps;
18 }

 

9.做慢慢消失的提示文字,并且是圆角的,可以用UIlable来做。

 1 UILabel *warnLabel = [[UILabel alloc]initWithFrame:CGRcctMake(100,400,40,20)];
 2 warnLabel.text = @"这是弹出的提示";
 3 warnLabel.textAlignment = NSTextAlignmentCenter; //文字居中
 4 warnLabel.backgroundColor = [UIColor darkGrayColor];
 5 warnLabel.alpha = 1.0;
 6 warnLabel.font = [UIFont systemFontOfSize:10.0];
 7 warnLabel.textColor = [UIColor whiteColor];
 8 
 9 //UILabel设置为圆角,网上说的大部分不全面,clipsToBounds属性设置为YES才会有效果。也不需要引入QuartzCore
10 warnLabel.layer.cornerRadius = 10;
11 warnLabel.clipsToBounds = YES;
12 
13 [self addSubview:warnLabel];
14 
15 //关于动画设置有2种方法,第一种首尾动画苹果已不推荐
16 [UIView beginAnimations:nil context:nil];
17 [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
18 [UIView setAnimationDuration:3.0];
19 [UIView setAnimationDelegate:self];
20 warnLabel.alpha = 0.0;
21 [UIView commitAnimations];
22 
23 //第二种block动画
24 [UIView animateWithDuration:3.0
25                      animations:^{
26                          //要执行的动画
27                          warnLabel.alpha = 0.0;
28                      } completion:^(BOOL finished) {
29                          //动画完成后要执行的
30                          [warnLabel removeFromSuperview];
31                      }];

从上可以看出,block动画对执行完毕后的动作也做了说明,功能较多。

 

10.要想让UIScrollView滚动,有3个属性可以设置,contentSize,contentInset,contentOffset。主要设置contentSize就可以了。如在scrollView中

1 //表示在view的宽和高时分别可移动多长,下面表示在宽不能移动,高可以向下滚动170
2 self.contentSize = CGSizeMake(self.frame.size.width, self.frame.size.height + 170);
3 
4 //contentInset表示增加可滚动的区域,顶端增加64,底部增加44
5 self.contentInset = UIEdgeInsetsMake(64, 0, 44, 0);
6 
7 //contentOffset设置一开始的滚动位置,下面表示视图向下移动60单位
8 self.contentOffset = CGPointMake(0, -60);

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。