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);
时间: 2024-10-28 22:10:04

IOS工作笔记(三)的相关文章

iOS工作笔记之NSClassFromString

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init]; 和 id myObj = [[MySpecialClass alloc] init]; 是一样的.但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已. 因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化. 比如在iPhone中,NSTask可能就会出现这种情

IOS工作笔记(二)

1.懒加载(即延迟加载)只有被调用时才初始化,防止资源浪费,需要重写对象 的get方法,且必须写成成员变量形式,如_imageData.可以这么写,如: 1 @property(nonatomic,strong) NSArray *imageData; 2 3 -(NSArray *)imageData{ //重写imageData的get方法 4 if(_imageData == nil){ 5 //初始化数据 6 NSMutableDictionary *image1 = [NSMutabl

【工作笔记三】非常全面的讲解Hosts文件

原文:http://www.cnblogs.com/zgx/archive/2009/03/10/1408017.html 很奇怪有很多人不知道Hosts是什么东西.在网络病毒日渐盛行的今天,认识Hosts其实是很有用的,因为有好多的网页木马都盯上了这个文件,而在很多时候,您只需打开这个文件做一个小小的修改,就完全可以解决您认为非常困难的问题. 一.Hosts文件所在地址 Vista.Xp和2000和2003等系统:在C:\windows\system32\drivers\etc文件夹中. Wi

IOS工作笔记(五)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.frame的打印,可以用 NSLog(@"%@",NSStringFromCGRect(self.view.frame)); 2.UIButton文字的对齐方式,以左对齐为例 myBtn.titleLabel.textAlignment = NSTextAlignmentLeft;//这种设置方式无效 myBtn.contentHorizontalAlignment = UIControlConte

IOS工作笔记(十)

1.关于textField 在做一些操作,比如登录时账号或密码为空的处理时,有两种方案.①登录按钮可以点击,但会用alertView提示“账号或密码为空”的消息.②此时登录按钮不可点击,只有账号和密码都有值时,才可以点击.两种方法推荐第二种,体验较好.此时需要实现UITextFieldDelegate,并且 1 - (BOOL)textFieldShouldClear:(UITextField *)textField{ 2 //清空内容时同时使按钮不可点击 3 _saveBtn.enabled

IOS工作笔记(七)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.在定义UITableViewCell时,组件可以直接加,也可以添加到contentView中 [self addSubViews:myBtn]; [self.contentView addSubViews:myBtn]; 但最好添加在contentView中,因为contentView可以定义很多东西. 2.关于下拉刷新和上拉加载,可以用是第三方框架MJRefresh,地址在 https://github.c

IOS工作笔记(四)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.ios7中,对状态栏的调整是在控制器中进行的. 1 //设置状态栏为白色 2 -(UIStatusBarStyle)preferredStatusBarStyle{ 3 return UIStatusBarStyleLightContent; 4 } 5 //隐藏状态栏 6 -(BOOL)prefersStatusBarHidden{ 7 return YES; 8 } 2.给UIImageView或UILa

iOS 学习笔记 三 (2015.03.05)

// 当发现了我们所需要的characteristic,我们最想做的就是查看下这个characteristic的value是多少.也就是说,我们需要一个接收数据的操作. - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error 在CoreBluetooth中,提供了两种方法:1. [peripheral

IOS工作笔记(九)

关于IOS与服务器交互json数据①从服务器接受json数据:这个可以用AFN,接受方式一般为get.如: 1 +(NSArray *)getContactsFromServer:(ZMMeetingAddViewController *)meetingAddController{ 2 NSMutableArray *contactsArr = [NSMutableArray array]; 3 4 NSString *urlGetContactsFromServer = [NSString s