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

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

  • 相关阅读:
    素数筛的2种方法
    c++含结构体的sort()使用
    构建c++二维vector
    c语言输入单字符避免回车的四种方法
    menset()在c++中的作用
    杭电oj hud1092 1093 活用EOF&n--
    EOF在while(scanf("%d",&n))中的作用
    KMP算法
    图解HTTP(3)
    图解HTTP(2)
  • 原文地址:https://www.cnblogs.com/Apologize/p/4190200.html
Copyright © 2020-2023  润新知