iOS正确的自定义View方式

自定义view的加载方式有loadNibNamed或者nib.instantiate但是这些都不能使xib直接在storyboard上直接使用。

本文分享出可以在storyboard上直接把xib显示出来,也可以直接用代码加载出来的技能。接下来放大招啦!

1. 新建一个UIview,再建一个xib与之名称对应。

2. 绑定xib的File‘s Owner 的class,注意不是选中View,而是File‘s Owner。

3. 在view中开始代码初始化如下:

override init(frame: CGRect) {

super.init(frame: frame)

initFromXib()

}

required init?(coder aDecoder: NSCoder) {

super.init(coder: aDecoder)

initFromXib()

}

func initFromXib() {

let myclass = type(of: self)

let bundle = Bundle(for: myclass)

let name = NSStringFromClass(myclass).components(separatedBy: ".").last

let nib = UINib(nibName: name!, bundle: bundle)

self.contentView = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

self.contentView.frame = bounds

self.addSubview(contentView)

}

每次都要这样写是不是有点麻烦呢?

扩展一个协议NibLoadable,把initFromXib()里面的这段放在协议里。像这样

extension Nibloadable where Self : UIView {

static func loadNibView(className: Self) -> UIView {

let myclass = type(of: className)

let bundle = Bundle(for: myclass)

let name = NSStringFromClass(myclass).components(separatedBy: ".").last

let nib = UINib(nibName: name!, bundle: bundle)

return nib.instantiate(withOwner: className, options: nil)[0] as! UIView

}

}

那么initFromXib()就变成这样,是不是更简化了也用上了swift的协议

func initFromXib() {

self.contentView = CustomXibView.loadNibView(className: self)

self.contentView.frame = bounds

self.addSubview(contentView)

}

然而还不够,这些没次创建view都需要重复写,在加上@IBInspectable的属性就更多,不行我还想简化。继承思想来一波,写一个基础View把所有的属性都写在这里以及初始化方法也都写在这里。自定义view继承它,只需要对外提供一个model变量,来设置内容更改就行。

// 基础view

@IBDesignable

class CGBaseView: UIView, Nibloadable

// 这里是自定义view部分

class TestXibView: CGBaseView {

var model: [String: String]? {

didSet {

desL.text = model?["des"]

}

}

看文章还不够详细,那来开代码吧!附上github地址:https://github.com/caoge9/CG_CustomXibView.git

原文地址:https://www.cnblogs.com/caodedi-88/p/10084013.html

时间: 12-07

iOS正确的自定义View方式的相关文章

详解iOS开发之自定义View

iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加一个Hypnosister的类,这个类选择继承UIObject.修改这个类,使他继承:UIView @interface HypnosisView : UIView 自定义View的关键是定义drawRect: 方法,因为主要是通过重载这个方法,来改变view的外观.例如,可以使用下面代码绘制一个很

iOS中 xib自定义View在storyboard中的使用

1,创建UIView 的SubClass 命名为MyView 2, new一个名为MyView的xib p1 3,配置xib的属性 p2 4,为View 添加背景色,添加一个按钮并定制按钮约束,这里我添加的约束为垂直居中,Button与View等宽,Button左边起点位置为0. p3 5,设置xib中的File’s owner = MyView, 拖拽view 到关联的代码中命名为contentView p4 6, 在storyboard 中对ViewController 添加一个View,之

IOS 使用XIB 自定义View

一般自定义View       代码方式 有 在初始化的时候添加 子Views - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // add subviews } return self; } 还有种 是自己画. 重载 - (void)drawRect:(CGRect)rect { } 如果  布局复杂的话  这种代码方式  可以郁闷死人   看不到效果,慢慢调 ,代码冗长..

iOS 用xib自定义view控件 debug笔记

1.在view不是很复杂的情况下,如果多次检查后依旧出现coding-compliant这种情况,干脆彻底删除这个xib重新新建一个xib来做一遍.(至今未明真相) 2.初始化xib中的view的大致步骤: //在superView中调用此方法以初始化此view + (XTTopFloatingView*)instanceXTTopFloatingView{ NSArray *nibView = [[NSBundle mainBundle]loadNibNamed:@"XTTopFloating

Android自定义View的实现方法,带你一步步深入了解View(四)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不 知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了LayoutInflater的原理分析.视图的绘制流程. 视图的状态及重绘等知识,算是把View中很多重要的知识点都涉及到了.如果你还没有看过我前面的几篇文章,建议先去阅读一下,多了解一些原理方面的东 西. 之前我有承诺过,会在View这个话题上多写几篇博客,讲一讲View的

零门槛!ZBLibrary仿微信朋友圈自定义View,就是这么简单!

传统方法是继承现有View再重写方法,这种方式缺点很多: 1.往往不能在xml编辑器中预览效果: 2.比较难实现预期效果,比如设置宽度为wrap_content,实际显示为match_parent等: 3.需要在xml代码中声明自定义View的全路径,经常无法自动补全,需要手动复制粘贴路径: 4.一旦自定义View修改了全路径(移动至其它package.删除等),xml代码中并不会同步,但能编译通过,然后在渲染这个自定义View时崩溃: 5.需要学习draw,measure等平时比较少用的方法:

iOS开发——笔记篇&关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结

关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结 一:Plist读取 1 /******************************************************************************/ 2 一:简单plist读取 3 4 1:定义一个数组用来保存读取出来的plist数据 5 @property (nonatomic, strong) NSArray *shops; 6 7 2:使用懒加载的方

Android自定义View的三种实现方式

在毕设项目中多处用到自定义控件,一直打算总结一下自定义控件的实现方式,今天就来总结一下吧.在此之前学习了郭霖大神博客上面关于自定义View的几篇博文,感觉受益良多,本文中就参考了其中的一些内容. 总结来说,自定义控件的实现有三种方式,分别是:组合控件.自绘控件和继承控件.下面将分别对这三种方式进行介绍. (一)组合控件 组合控件,顾名思义就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件.比如很多应用中普遍使用的标题栏控件,其实用的就是组合控件,那么下面将通过实现一个简单

iOS开发 --UIScrollView添加xib自定义view

实现功能:3步注册流程,点击下一步进入下一个页面,填写信息. 实现思路: 1.由于需要在第一个注册页面添加“退出注册”的按钮,所以没有使用UINavigation实现.而是使用一个UIController. 2.三个注册页长度不同,所以将UIScrollView作为subView添加到VC的view中(UIScrollView的frame长宽写定). 3.自定义三个UIView,当需要展示某个view时,根据此view的frame改变UIScrollview的contentViewSize 具体

IOS中使用.xib文件封装一个自定义View

1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppView : UIView @property(strong,nonatomic) MyApp*app; +(instancetype)appView; @end MyAppView.h #import "MyAppView.h" #import "MyApp.h" @i