zoukankan      html  css  js  c++  java
  • IOS工作笔记(三)

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

    1.选定ipad支持的方向,如强制横屏等,需要在General——》Deployment Info ——》Device Orientation选择,含义如下:

    所以要想强制横屏的话,可以点选

    2.UIView中如何添加xib文件?

    如新建一个UIView为DocDetailView,那么建的那个xib文件在custom class中class应写成跟UIView名字一样的,这里要写成DocDetailView,而不是默认的UIView。
    在.m文件中可以这样加载

     1 -(id)initWithFrame:(CGRect) frame{
     2     self = [super initWithFrame:frame];
     3     if(self){
     4         [self makeDocDetail];
     5     }
     6 }
     7 
     8 -(void) makeDocDetail{
     9     NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"DocDetailView" owner:self options:nil];
    10     DocDetailView *docDetail = [views objectAtIndex:0];
    11     //最好用下边的,这两个等价
    12     DocDetailView *docDetail = [views lastObject];
    13     [self addSubView:docDetail];
    14 }

    3.当发生错误

    StoryboardApp[8593:207] Failed to instantiate the default view controller for UIMainStoryboardFile 'MainStoryboard' - perhaps the designated entry point is not set?

    原因在于storyboard中的没有一个viewcontroller设置initial scene,需要选择一个view controller作为storyboard的第一个界面。

    4.做注释时,一般用“/**  注释内容  */”,这是为了生成文档时方便。(前边两个*,后边一个*);

    5.字符串合并。可以看以下代码

    1 NSString *str1 = @"Hello ";
    2 NSString *str2 = @"World";
    3 NSString *str = [str1 stringByAppendingString:str2];

    6.九宫格的坐标算法,使用for循环处理多个uiview的位置、大小等,最终要实现的效果如下。

    这是在1个UIView上贴12个小的UIView,每个小UIView上再添加1个UIImageView,UILabel,UIButton.
    在处理这12个小UIView的位置时的算法如下:

    把第一行和第一列分别作为0行,0列。那么每个小UIView的X坐标跟列想关,Y坐标跟行相关,因此只要知道了行号和列号(即该view位于哪行哪列),就能得出其坐标。

     1 int appCount = self.allApps.count;//先获取app的总数,独立出来,方便封装
     2 //allApps为数组,数据为字典
     3 int appShowRow = 3; //定义每行要展示的app数,即使appCount改变,也无需改代码。
     4 
     5 //定义每个小view的大小
     6 int appViewW = 85;
     7 int appViewH = 90;
     8 
     9 //定义每个小view之间间隙的大小
    10 int MARGINE_Y = 20;
    11 int MARGINE_X = (self.frame.size.width - appShowRow * appViewW)/(appShowRow + 1);
    12 
    13 for (int i=0; i<appCount; i++) {
    14         UIView *appView = [[UIView alloc]init];
    15         
    16         //行号决定Y值,列号决定X值
    17         int rowIndex = i / appShowRow; //行号,注意符号
    18         int colIndex = i % appShowRow; //列号,取余
    19         
    20         int appViewX = 20 + (appViewW + MARGINE_X) * colIndex;
    21         int appViewY = 30 + (appViewH + MARGINE_Y) * rowIndex;
    22         
    23         [appView setFrame:CGRectMake(appViewX, appViewY, appViewW, appViewH)];
    24 
    25         //往view添加图片,此时imageView的父view是小的view,而不是最大的view
    26         NSDictionary *appInfo = self.allApps[i];
    27 
    28         //有了model后,可以这么写
    29         //AppModel *appModel = self.allApps[i];
    30         //然后相应的appImg和appText就可以改为
    31         //appImg.image = [UIImage imageNamed:appModel.img];
    32         //appText.text = appModel.label;
    33            //appModel的img和label属性要在模型的.h中定义,不能在.m中定义
    34         
    35         //添加图片,此时图片的位置就是相对于appView,而不是SquaredView
    36         UIImageView *appImg = [[UIImageView alloc]init];
    37         int appImgW = 45;
    38         int appImgH = 45;
    39         int appImgX = (appViewW - appImgW) * 0.5;//小view的宽度- imgView的宽度,再除以2
    40         int appImgY = 0;
    41         
    42         appImg.frame = CGRectMake(appImgX, appImgY, appImgW, appImgH);
    43         appImg.image = [UIImage imageNamed:appInfo[@"icon"]];
    44         [appView addSubview:appImg];
    45 
    46         //添加UILabel和UIButton的省略
    47 
    48 
    49         [self addSubview:appView]
    50 }

    7.对于一些属性初始化时需要注意,方法名要和属性名一致,在其它方法中调用时只能写成self.xxx,不能写成_xxx,否则调用不到。

    _xxx最好只写在相应的get方法内,防止死循环。

     1 @property(nonatomic,strong) NSArray *allApps;
     2 //在其它方法调用时,只能写成self.allApps,不能写成_allApps.如
     3 -(void)drawScrollView{
     4     for(int i=0;i<self.allApps.count,i++){
     5         //其他代码
     6     }
     7 }
     8 
     9 //重写allApps的get方法,方法名要和属性名一致
    10 -(NSArray *)allApps{
    11     if(_allApps==nil){
    12     //if(!_allApps){  //等价
    13         //读取plist文件
    14         NSString *appPath = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
    15         _allApps = [[NSArray alloc]initWithContentsOfFile:appPath];
    16     }
    17     return _allApps;
    18 }

    8.字典(NSDictionary)转模型(model)

    为什么要转?因为字典容易出错。因为设置数据和读取数据都用“字符串”型key,当输错NSString类型数据时,编译器既不会智能提示,也不会报错。

    模型都继承自NSObject.如

    dict[@"name"] = @"tom";
    NSString *name = dict[@"name"];

    需要转换为模型,需要实现两个方法。

    -(instancetype)initWithDict:(NSDictionary *) dict;
    +(instancetype)xxxWithDict:(NSDictionary *) dict;

    第二种写法之所以这么写,是因为系统的命名规范。系统中有类似的

    NSString stringWithString:(NSString *);
    NSDictionary dictionaryWithDictionary:(NSDictionary *);

    下面举一个关于模型的例子。模型几乎为固定写法。
    .h文件

    1 @interface AllApp:NSObject
    2 @property (nonatomic, copy) NSString *name;//app名称
    3 @property (nonatomic, copy) NSString *icon;//app图标
    4 
    5 //一般写两种方法,调用哪一种也可以
    6 -(instancetype)initWithDict:(NSDictionary *)dict;//属于构造方法
    7 +(instancetype)appWithDict:(NSDictionary *)dict; //不是构造方法,工厂方法
    8 
    9 @end

    .m文件中

     1 @implementation AllApp
     2 //构造方法有固定格式,首先必须初始化
     3 -(instancetype)initWithDict:(NSDictionary *)dict{
     4     if(self = [super init]){
     5         self.name = dict[@"name"];
     6         self.icon = dict[@"icon"];
     7     }
     8     return self;
     9 }
    10 
    11 +(instancetype)appWithDict:(NSDictionary *)dict{
    12     return [[self alloc]initWithDict:dict];
    13 }
    14 
    15 @end

    然后第7条的初始化方法中可以改为:

     1 -(NSArray *)allApps{
     2     if(_allApps==nil){
     3     //if(!_allApps){ //与上等价
     4         NSString *appPath = [[NSBundle mainBundle] pathForResource:@"app" ofType:@"plist"];
     5         NSArray *dictArray = [NSArray arrayWithContentOfFile:appPath];
     6 
     7         //将dictArray的所有字典转换成模型对象,放到新的数组中
     8         NSMutableArray *appArray = [NSMutableArray array];
     9         for(NSDictionaty *dict in dictArray){
    10             AllApp *app = [AllApp appWithDict:dict];
    11             //也可以写成这样
    12             //AllApp *app = [[AllApp alloc]initWithDict:dict]];
    13             [appArray addObject:app];
    14         }
    15         _allApps = appArray;
    16     }
    17     return _allApps;
    18 }

    9.做慢慢消失的提示文字,并且是圆角的,可以用UIlable来做。

     1 UILabel *warnLabel = [[UILabel alloc]initWithFrame:CGRcctMake(100,400,40,20)];
     2 warnLabel.text = @"这是弹出的提示";
     3 warnLabel.textAlignment = NSTextAlignmentCenter; //文字居中
     4 warnLabel.backgroundColor = [UIColor darkGrayColor];
     5 warnLabel.alpha = 1.0;
     6 warnLabel.font = [UIFont systemFontOfSize:10.0];
     7 warnLabel.textColor = [UIColor whiteColor];
     8 
     9 //UILabel设置为圆角,网上说的大部分不全面,clipsToBounds属性设置为YES才会有效果。也不需要引入QuartzCore
    10 warnLabel.layer.cornerRadius = 10;
    11 warnLabel.clipsToBounds = YES;
    12 
    13 [self addSubview:warnLabel];
    14 
    15 //关于动画设置有2种方法,第一种首尾动画苹果已不推荐
    16 [UIView beginAnimations:nil context:nil];
    17 [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    18 [UIView setAnimationDuration:3.0];
    19 [UIView setAnimationDelegate:self];
    20 warnLabel.alpha = 0.0;
    21 [UIView commitAnimations];
    22 
    23 //第二种block动画
    24 [UIView animateWithDuration:3.0
    25                      animations:^{
    26                          //要执行的动画
    27                          warnLabel.alpha = 0.0;
    28                      } completion:^(BOOL finished) {
    29                          //动画完成后要执行的
    30                          [warnLabel removeFromSuperview];
    31                      }];

    从上可以看出,block动画对执行完毕后的动作也做了说明,功能较多。

    10.要想让UIScrollView滚动,有3个属性可以设置,contentSize,contentInset,contentOffset。主要设置contentSize就可以了。如在scrollView中

    1 //表示在view的宽和高时分别可移动多长,下面表示在宽不能移动,高可以向下滚动170
    2 self.contentSize = CGSizeMake(self.frame.size.width, self.frame.size.height + 170);
    3 
    4 //contentInset表示增加可滚动的区域,顶端增加64,底部增加44
    5 self.contentInset = UIEdgeInsetsMake(64, 0, 44, 0);
    6 
    7 //contentOffset设置一开始的滚动位置,下面表示视图向下移动60单位
    8 self.contentOffset = CGPointMake(0, -60);
  • 相关阅读:
    ABAP 没有地方输入H 进入DEBUG 怎么办?
    Jsoup实现java模拟登陆
    Jsoup模拟登陆例子
    Jsoup:解决java.net.UnknownHostException的问题
    Java抓取网页数据(原网页+Javascript返回数据)
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
    MyEclipse + Tomcat 热部署问题
    管道寄售库存MRKO结算后,冲销问题
    c#操作appsettiongs
    让你的微信小程序具有在线支付功能
  • 原文地址:https://www.cnblogs.com/Apologize/p/4186449.html
Copyright © 2011-2022 走看看