问题-如何自定义带Xib的UIView

前言

<p>最近要重构公司的几个项目,不过项目都是通过Xib和storyboard实现的,全部改成纯代码实现就相当于要重写项目了,比较懒得我表示无法接受,所以决定保留Xib或storyboard。不过退一步说,加入了sizeClass和约束的xib确实越来越成熟了,对于只适配iOS7之后版本的App确实是更好的选择,但也有一定的缺陷,xib让每个界面都成了特例,很难总结一些共通的方法像基类一样共用,没办法简单化一些模块,那么,该如何解决不便重用的问题呢?

<p>基于自己封装的一套基类一直用的比较顺手,所以我想把纯代码和Xib揉合在一起用,主干逻辑上的一级界面用纯代码,界面里的子视图用Xib,既能有Xib的可视化优点,又能把一些功能模块化方便重用。


自定义带xib的UIView

<p>1.继承UIView创建View类,命名ViewA,
![Uploading 7AE43696-2FEE-4407-B9D6-482D7AADFCAA_727092.png . . .]你会发现继承UIView的时候是不能勾选自动生成Xib的,继续第2步。
<p>2.新建一个Xib,取名ViewA.

新建Xib

小提示:
1.xib中view的 Custom Class必须设置为对应的名称,在这里必须设置成ViewA,乱写是无效的,必须设置为.h.m文件都已经存在的类,不然无效,用loadNib方法也没用。
2.xib中的File's Owner就算设置成ViewA,xib中的view也是无法连接到File's Owner的,因为此时ViewA类和xib中的view都是view,不存在从属关系
3.File's Owner就是类在xib中的表示方式,通过它管理跟xib中视图的关系

7AE43696-2FEE-4407-B9D6-482D7AADFCAA.png

<p>3.初始化,下面列出了测试了三种初始化方法以及对应的效果,只有方法三是可以的:
方法一:只有ViewA类中的代码有效,xib无效;
方法二:只有ViewA类中的代码有效,xib无效;
方法三:ViewA类中的代码有效,xib也有效。
结论:ViewA的类和ViewA的xib是同一级别,直接调用类只能有代码中的效果,因为ViewA的类不能自动管理ViewA的xib,而调用xib资源初始化就相当于初始化ViewA,所以也会调用ViewA类中的代码。

<p>方法一

   ViewA *viewA = [[ViewA alloc] initWithFrame:CGRectMake(10, 230, 100, 50)];
   [self.view addSubview:viewA];

<p>方法二

   ViewA *viewB = [[ViewA alloc] init];
   viewB.frame = CGRectMake( 120, 230, 100, 50);
   [self.view addSubview:viewB];

<p>方法三

   ViewA *viewC = [[NSBundle mainBundle] loadNibNamed:@"ViewA" owner:self options:nil][0];
   viewC.frame = CGRectMake( 230, 230, 100, 50);
   [self.view addSubview:viewC];

小提示:自定义的带xib的UIView,如果其中添加了子视图并且添加了约束,其他视图应用这个自定义视图时,改变它的frame,它里面的子视图会根据约束改变。


自定义带xib的UIViewController

xib是UIView

<p>xib中的视图是UIView时,视图连接至File's Owner 的view,作为UIViewController的view属性。
这种情况下方式一、方式二的初始化方式都可以,建议用方式二,因为,效果一样,还tm代码少。
<p>方式一

    ViewControllerA *vcA = [[ViewControllerA alloc] initWithNibName:@"ViewControllerA" bundle:nil];
    vcA.view.frame = CGRectMake(10, 10, 200, 100);
    [self.view addSubview:vcA.view];

<p>方式二

    ViewControllerA *vcB = [[ViewControllerA alloc] init];
    vcB.view.frame = CGRectMake(10, 120, 200, 100);
    [self.view addSubview:vcB.view];
xib是UIViewController

<p>xib中的视图是UIViewController时,xib中的控制器和类本身是同级,xib中的视图无法再作为UIViewController的view属性。
只能通过以下方式初始化:

    ViewControllerB *vcBA = [[NSBundle mainBundle] loadNibNamed:@"ViewControllerB" owner:self options:nil][0];
    vcBA.view.frame = CGRectMake(10, 340, 100, 50);
    
    [self.view addSubview:vcBA.view];

总结

<p>逻辑图主干上的界面用纯代码,子视图用xib这种模式还不完全确定。

  • 优点

    • 主干用纯代码可以调用基类的方法,比如自动在界面超出界面时添加滚动视图并自动调整滚动视图大小,快捷定义导航栏内容等等
    • 子视图全部分离出去逻辑会更清晰,各自模块化
  • 缺点

    • 单独对子视图通过xib自定义,会大量增加类,本来一个试图控制器就能解决的事,用这种方式需要多好多个子视图的类。
    • 子视图被单独以类的形式分离出去,只能用纯代码管理子视图之间的交互。
    • 主干视图控制的动画不能通过约束实现,只能纯代码控制。约束实现动画点这里
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 首先声明,我这是根据别人的讲解来写出来的,,, 一、关于xib 1.xib和nib 在程序里面我们看到的基本上是U...
    湮灭_尘事阅读 3,565评论 1 14
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,977评论 4 60
  • 大多数Ios开发者都喜欢运用xib以及约束来布局,这样省去了大量初始化代码,但是xib的使用也是存在不少差异的: ...
    Hanser0503阅读 9,642评论 1 6
  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,777评论 0 2
  • 近来好像又开始晚睡了 不知道是不是要开学了 亦或是肚子开始抗议了 似乎是最后一个学期了 毕业季这样说来就来了 看完...
    明琬琰阅读 84评论 1 2