说明:记录下学习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 : UITableViewCell 2 /** 自定义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里内容即可,无需定义frame 13 -(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里组件的frame 25 - (void)layoutSubviews 26 { 27 //一定要加上这句 28 [super layoutSubviews]; 29 30 //此处不能用self.contentView.frame.size.height,否则高度会小1 31 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 = @"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 = [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;
需要知道的是,代理方法都是最后才执行的。