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

时间: 2024-10-20 02:51:56

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

详解iOS开发之自定义View

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

[IOS Tableview] cell自定义view显示错误问题

问题介绍:按照tableviewcell的tag自定义cell的view显示的时候,会出现拖动时显示错误情况. 我做的是一个下载界面,我为了简化问题,就把问题设定为,tag==1的cell已下载,加载时就把已下载的cell的label显示为蓝色.其余默认为黑. 比如我在代码里,想要tag==1的cell的label字体为蓝色,这样写就会出现上下拖动时tag==11的也出现蓝色(视具体情况而定). if([cell.tag==1){ //tag==1就把label显示为蓝色 cell.label.

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开发之自定义View

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

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等平时比较少用的方法:

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

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