首页 > 代码库 > 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工作笔记(五)