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 : 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;

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

原文地址:https://www.cnblogs.com/Apologize/p/4190200.html