首页 > 代码库 > IOS工作笔记(五)

IOS工作笔记(五)

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

1.frame的打印,可以用

NSLog(@"%@",NSStringFromCGRect(self.view.frame));

 

2.UIButton文字的对齐方式,以左对齐为例

myBtn.titleLabel.textAlignment = NSTextAlignmentLeft;//这种设置方式无效myBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;//这样才可以

此时会有点问题,文字会紧贴到左边框,可以用

myBtn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);//使文字距离左边框保持10个像素的距离。

 

3.点击按钮使一个view隐藏或出现,方法很简单,一句话搞定。

-(void)showOrHidden{    myView.hidden = !myView.hidden;}

 

4.如何动态获取cell的高度,如在UITableView中定义

1 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{2     return 80;3 }

而在UITableViewCell中,
.h文件中

1 @interface JFTableViewCell : UITableViewCell2 /** 自定义cell的btn */3 @property(nonatomic,strong) UIButton *contentBtn;4 @property(nonatomic,strong) UIButton *costBtn;5 6 /** 定义btn位置 */7 -(void)setupBtnFrame;8 9 @end

.m文件中

 1 @implementation JFTableViewCell 2  3 -(void)setupBtnFrame{ 4     //viewH本来想获取cell的高度,即80.但此处返回的会是44,因为cell的默认高度是44 5     CGFloat viewH = self.contentView.frame.size.height; 6      7     self.contentBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 8     CGFloat contentBtnW = 300; 9     CGFloat contentBtnH = 30;10     CGFloat btnY = (viewH - contentBtnH) * 0.5;11     self.contentBtn.frame = CGRectMake(10, btnY, contentBtnW, contentBtnH);12     self.contentBtn.backgroundColor = [UIColor brownColor];13     [self.contentView addSubview:self.contentBtn];14     15     self.costBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];16     CGFloat costBtnW = 40;17     CGFloat costBtnH = 30;18     self.costBtn.frame = CGRectMake(10 + contentBtnW + 30, btnY, costBtnW, costBtnH);19     self.costBtn.backgroundColor = [UIColor lightGrayColor];20     [self.contentView addSubview:self.costBtn];21 }22 23 @end

上述方法不会得到预期值,正确的方法是在setupBtnFrame中,只初始化btn就行,frame在layoutSubviews定义。这样才可以动态获取cell高度,所以以后自定义cell是,要写成下面的

 1 @implementation JFTableViewCell 2  3 //重写该方法,否则在cell复用时,点击cell会引起文字混乱 4 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ 5     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 6     if (self) { 7         [self setupBtnFrame]; 8     } 9     return self;10 }11 12 //该方法只初始化cell里内容即可,无需定义frame13 -(void)setupBtnFrame{14     15     self.contentBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];16     self.contentBtn.backgroundColor = [UIColor brownColor];17     [self.contentView addSubview:self.contentBtn];18     19     self.costBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];20     self.costBtn.backgroundColor = [UIColor lightGrayColor];21     [self.contentView addSubview:self.costBtn];22 }23 24 //在该方法里定义cell里组件的frame25 - (void)layoutSubviews26 {27     //一定要加上这句28     [super layoutSubviews];29     30     //此处不能用self.contentView.frame.size.height,否则高度会小131     CGFloat cellHeight = self.frame.size.height;32     CGFloat contentBtnW = 300;33     CGFloat contentBtnH = 30;34     CGFloat btnY = (cellHeight - contentBtnH) * 0.5;35     self.contentBtn.frame = CGRectMake(10, btnY, contentBtnW, contentBtnH);36     37     CGFloat costBtnW = 40;38     CGFloat costBtnH = 30;39     self.costBtn.frame = CGRectMake(10 + contentBtnW + 30, btnY, costBtnW, costBtnH);40 }41 @end

 

5.NSArray里只能放对象,所以若想往数组里添加基础数据类型,只能转换为NSNumber类型,只要往int数据前加个@即可,无须加双引号。如:

NSArray *array = [[NSArray alloc]init];array = @[@1,@2,@3,@10];

 

6.pch文件可以定义一些全局的宏(就是所有文件在不引用的情况下都可以直接使用),也可以定义一些全部的头文件(也是无需引入直接使用)。

常用的一种方法是NSLog上,它比较耗资源,在调试阶段可以使用,发布后就不再需要,因此可以在pch中定义。如

1 #ifdef DEBUG //调试阶段2 #define JFLog(...) NSLog(__VA_ARGS__)3 #else //发布阶段4 #define JFLog(...)5 #endif

上述代码可以用JFLog代替NSLog,并且在发布程序时,自动将所有的打印功能失效,节约资源。

 

7.IOS中,UISwitch的大小是固定的,因此只能改变它的位置。想要实现大小改变的效果,只能用transform。如下:

1 UISwitch *mySwitch = [[UISwitch alloc]init];2 mySwitch.transform = CGAffineTransformMakeScale(0.5,0.5);3 //括号中数字的含义是:第1个表示X轴方向的缩放(或放大)倍数,第2个表示Y轴方向的缩放(或放大)倍数。4 mySwitch.frame = CGRectMake(0,0,20,20);  5 //frame只能改变位置,后边的参数是无意义的。

 

8.controller和view中都有一些固定的写法。

在controller中

1 -(void)viewDidLoad{2     [super viewDidLoad];3     //以下添加自己的方法4 }

在view中

1 -(id)initWithFrame:frame{2     self = [super initWithFrame:frame];3     if(self){4         //添加自己的方法5     }6     return self;7 }

 

9.viewDidLoad中是先加载视图,然后再请求数据。所以在viewDidLoad中请求数据是获取不到的。

 

10.controller之间跳转,如从controllerA跳往controllerB,不用presentViewController和pushViewController,而是直接在controllerA的页面上直接粘B的页面,那么不仅要添加B的view,还得添加B的controller。如在controllerA中写:

1 controllerB *listController = [[controllerB alloc]init];2 [self.view addSubview:listController.view];3 //controller不能忘记添加4 [self addChildViewController:listController];

 

11.NSString 转换 ,以下面的为例

NSString *str =[NSString stringwithFormat:@"%@",textfield.text];

 

12.在处理url时,NSString包含中文字符时需要转换为NSURL。如:

1 urlStr = [NSString stringWithFormat:@"http://42.62.41.23/davba_mck/AppMckHospital.do?id=25&area=%@ %@&infodim=quarter&name=李四",_city.cityNamed,_city.cityAttribute];2 urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];3 //经过处理后系统才能识别

 

13.NSString判断有无特定字符,并截取。以截取小数点前的数为例。如23.0截取后就剩下23,操作如下:

 1 NSString *tempData = http://www.mamicode.com/@"33.0"; 2 NSString *pointStr = @"."; 3 NSRange range = [tempData rangeOfString:pointStr]; 4 //判断有无小数点 5 if(range.location == NSNotFound){ //不包含 6      7 }  8 if (range.length > 0){ // 包含 9     NSInteger pointIndex = range.location;10     tempData = http://www.mamicode.com/[tempData substringToIndex:pointIndex];// 不包含小数点11 }

 

14.CGRectGetMinX、CGRectGetMaxY等属性的含义。

CGRectGetMinX 返回矩形左边缘的坐标;
CGRectGetMaxY 返回矩形顶部的坐标;
CGRectGetMinY 返回矩形底部的坐标
其余以此类推。都是以一个矩形为例。

 

15.代理的用法。我的理解就是某个类A想把值传给其它类使用,如类B,那么在A类中就要写个代理,B类中实现代理方法就可以获取值。

如在A类.h中,

 1 @class MSAccessListModel; 2 @protocol MSAccessListDelegate <NSObject> 3  4 //其他类若想获取A中的值必须实现的方法 5 -(void)getAccessListArray:(NSMutableArray *)array; 6  7 @end 8  9 @interface MSAccessListModel:NSObject 10 11 //代理的处理12 @property(nonatomic,assign) id<MSAccessListDelegate> myDelegate;13 -(void)makeRequestAccessList:(UIButton *)selectedBtn;14 @end

然后在A类的.m中,进行赋值即可

//dataArr为想传给其他类使用的值[self.delegate getAccessListArray:dataArr];

B类中想获取值,需实现该代理,在.m或.h都可以声明实现了A类的代理,下边是在.m中声明的

@interface MSHospitalAccessSecondController()<MSAccessListDelegate>@property(nonatomic,strong) MSAccessListModel *model;@end

此时需实现getAccessListArray方法,

1 //下面这行代码不能丢2 [self.model makeRequestAccessList:optionBtn];3 4 -(void)getAccessListArray:(NSMutableArray *)array{5     //array即为A中传功来的值6     self.mutabArr = array;7 }

最重要的一点就是,在B类的.m文件中,需要写类似于下边的代码(否则代理方法不执行)

self.delegate = self;

 需要知道的是,代理方法都是最后才执行的。

IOS工作笔记(五)