如何自定义View

5iOS第五天—自定义View以及KVC&KVO

xib的基本使用

xib的基本使用.png
  • 什么是xib?

    • xib就是缩小版的storyboard。
  • Xib和storyboard对比

    • 共同点:

      • 都用来描述软件界面
      • 都用Interface Builder工具来编辑
      • 本质都是转换成代码去创建控件
    • 不同点

      • Xib是轻量级的,用来描述局部的UI界面
      • Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系
  • Xib的加载

    • 方法1

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"xib文件名" owner:nil options:nil]
    ```

    • 方法2

    UINib *nib = [UINib nibWithNibName:@"xib文件名" bundle:nil];
    NSArray *views = [nib instantiateWithOwner:nil options:nil];
    ```

  • 使用xib自定义view的步骤

    • 新建自定义控件类
    • 新建xib文件(文件名建议和view的类名一致)

这时就可以在xib空文件中画自己想要的控件
- 修改xib中view的类名
- 封装xib的加载过程
- 增加模型属性,在模型属性set方法中设置数据到子控件上

  • 使用xib的注意点
    • 一个控件有2种创建方式

      • 通过代码创建

        • 初始化时一定会调用initWithFrame:方法
      • 通过xib\storyboard创建

        • 初始化时不会调用initWithFrame:方法,只会调用initWithCoder:方法
        • 初始化完毕后会调用awakeFromNib方法
    • 有时候希望在控件初始化时做一些初始化操作,比如添加子控件、设置基本属性,这时需要根据控件的创建方式,来选择在initWithFrame:、initWithCoder:、awakeFromNib的哪个方法中操作

简单的渐变动画代码实现

  • 一般为了避免控件位置尺寸变化的太突然以及添加一些特殊效果,我们要给变化过程加以控制,使其平缓过渡,一般只有frame和alpha这两个属性可以进行渐变动画。

    • 方式1: 首尾式

    [UIView beginAnimations:nil context:nil];

    //执行动画
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;

    [UIView commitAnimations];
    ```

    • 方式2: 回调式

    [UIView animateWithDuration:0.5 animations:^{
    //执行动画
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;
    }];
    //动画完成之后还有操作
    [UIView animateWithDuration:0.5 animations:^{
    //执行动画
    CGRect tempFrame = self.redView.frame;
    tempFrame.origin.y += 50;
    self.redView.frame = tempFrame;
    } completion:^(BOOL finished) {
    self.redView.backgroundColor = [UIColor blueColor];
    }];
    ```

  • 渐变动画的几种常用形式

    • UIViewAnimationOptionCurveEaseInOut 开始和结束比较慢,中间比较快
    • UIViewAnimationOptionCurveEaseIn 开场比较慢,后面比较快
    • UIViewAnimationOptionCurveEaseOut 开场正常,结尾比较慢
    • UIViewAnimationOptionCurveLinear 线性----> 匀速

UIButton补充——内边距调整

  • 可在属性栏里调整
内边距.png
  • 可通过代码调整
    //调整整体内容
    self.button.contentEdgeInsets = UIEdgeInsetsMake(10, 5, 0, 0);
    //调整Button内部图片的
    self.button.imageEdgeInsets = UIEdgeInsetsMake(5, 16, 0, 0);
    //调整button标题的
    self.button.titleEdgeInsets = UIEdgeInsetsMake(10, 5, 0, 0);
    

图片拉伸问题的解决方法

  • 当小图片被拉伸到很大尺寸的时候,这时候像素会变的很低,图片变得模糊,实际上往往会遇到图片适配不上imageView范围,因此会自动填充放大,导致图片边角变模糊问题。为了解决这个问题,我们让图片在拉伸的时候,设置中心附近1X1像素的区域随着拉伸而拉伸,其他区域不被拉伸,这样就保证了边缘的清晰度,图片看起来更美观。那么中心附近的1X1的区域是怎么计算出来的呢?我们规定一张图片(上半部分)和(下半部分-1)不被拉伸,规定(左半部分)和(右半部分-1)不被拉伸,那么就有1X1区域没有被包含在内,因此这个区域会被拉伸

  • 代码实现

    // 方式1:
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    // 作用: 根据传入需要保护的区域返回一张受保护的图片
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(image.size.height * 0.5, image.size.width * 0.5, image.size.height * 0.5 -1, image.size.width * 0.5 -1);
    /*
     UIImageResizingModeTile,  以平铺的方式进行拉伸
     UIImageResizingModeStretch, 直接拉伸平铺
     */
    UIImage *protectImage = [image resizableImageWithCapInsets:edgeInsets resizingMode:UIImageResizingModeTile];
    self.imageView.image = protectImage;
    
    //方式二
    UIImage *image = [UIImage imageNamed:@"chat_send_nor"];
    // rightCapWidth = width - leftCapWidth - 1
    // bottomCapWidth = height - topCapWidth - 1
    UIImage *protectImage = [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height *0.5];
    self.imageView.image = protectImage;
    
    • 方式三:给UIImage类添加分类,引用上两种代码实现
    • 方式四:直接在AppIcon选中图片在属性栏中的slicing(切片)属性进行调整
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容