iOS开发总结(A0) - 自定义UIView

根据我浅薄的ios开发经验,可以有以下方法添加custom uiview 的内容

1)draw

2)build in xib

3)add subviews

在custom uiview 的m文件中,一般按照以下对uiview进行初始设置:

 1 -(void)awakeFromNib{
 2     [self setup];
 3 }
 4 -(void)setup{
 5 //set up view
 6 }
 7 -(instancetype)initWithFrame:(CGRect)frame{
 8     self=[super initWithFrame:frame];
 9     if (self) {
10         [self setup];
11     }
12     return self;
13 }

setup 中一般要做的事情有:

- setBackgroundColor:

- setContentMode:

- setOpaque: (尽量设置为 yes)

- setTranslatesAutoresizingMaskIntoConstraints: (如果使用autolayout,设置为no,否则可能constraint可能会冲突)

以下说明这三种方式的基本做法

一、draw

重写uiview 的

-(void)drawRect:(CGRect)rect{}

方法,在该方法中画uiview 的内容。

-可以用UIBezierPath画;

- 可以用CGContext 各种画图函数;

- 可以用uikit中各种控件自带的draw方法画

(如UIImage 的drawInRect:, NSAttributedString的drawInRect:)

- 当设置custom view 内容,位置相关的properties时,调用[self setNeedDisplay],系统会适时绘制

问题:drawRect:方法中能否使用 addSubview 方法?

我的理解:最好不要使用,因为可能每次draw都要add subview,

问题:如何添加UIButton ?

我的理解:在setup中用addsubview 的方式添加button(不要设置frame,此时view的geometry未确定),用NSLayoutContraint 约束button 的位置,或者在drawInRect:中设置button的frame

问题:如何接受用户的touch/ gesture

我的理解:在setup 中添加gesture,或者重写以下方法处理用户交互

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{}

注意:drawInRect:是在main queue 中进行的,如果drawInRect:很复杂,或者需要绘制很多view, app 可能会卡。

对于这种情况,考虑concurrently build interface(参考wwdc视频,后续有随笔专门总结如何实现)

用draw 的方法添加view内容,代码复杂,但可以做到真正的customization

二、load from nib

1)新建view nib 文件,在ib中拖拽添加view的内容(注意view 的class 为custom view 的class),并设置constraint(如何设置constraint,将另有随笔总结)。

2)可用以下语句直接创建view

[[[NSBundle mainBundle]loadNibNamed:@"xib file name "
                                  owner:nil
                                options:nil] lastObject];

好处(前提是熟悉ib):

1.方便快速的添加内容、设置iboutlet 和ibaction、添加gesture等

2.便于 localization

3.便于设置constraint

三、add subviews

这种方法比较直接,在setup中增加subviews 就可以了(这里不适合设置frame等geometry信息),

但好像运行效率比较低

时间: 2024-10-13 20:50:09

iOS开发总结(A0) - 自定义UIView的相关文章

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

iOS开发UI篇—自定义瀑布流控件(蘑菇街实现)

iOS开发UI篇—自定义瀑布流控件(蘑菇街瀑布流) 一.简单说明 关于瀑布流 1.是使用UIScrollView实现的 2.刷新数据(reloadData)方法里面做哪些事情 3.layoutSubviews方法里面做哪些事情 4.模仿UItableView进行设计 完善: 瀑布流控件第一次显示到屏幕上的时候自动的向数据源索要数据,而不需要手动调用.这需要监听View的显示,View的显示有一个方法,叫做willMoveToSuperview:在该方法中直接刷新一次数据即可. 二.把自定义的瀑布

iOS开发UI篇—自定义瀑布流控件(cell的循环利用)

iOS开发UI篇—自定义瀑布流控件(cell的循环利用) 一.简单说明 当滚动的时候,向数据源要cell. 当UIScrollView滚动的时候会调用layoutSubviews在tableView中也是一样的,因此,可以用这个方法来监听scrollView的滚动,可以在在这个地方向数据源索要对应位置的cell(frame在屏幕上的cell). 示例: 当scrollView在屏幕上滚动的时候,离开屏幕的cell应该放到缓存池中去,询问即将(已经)进入到屏幕的cell,对于还没有进入到屏幕的ce

iOS开发多线程之自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发多线程篇—自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发UI篇—自定义瀑布流控件(基本实现)

iOS开发UI篇—自定义瀑布流控件(基本实现) 一.基本实现 说明:在View加载的时候,刷新数据. 1.实现代码 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 06-瀑布流 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYViewControll

iOS开发UI篇—自定义瀑布流控件(接口设计)

iOS开发UI篇—自定义瀑布流控件(接口设计) 一.简单说明 1.关于瀑布流 电商应用要展示商品信息通常是通过瀑布流的方式,因为每个商品的展示图片,长度和商都都不太一样. 如果不用瀑布流的话,展示这样的格子数据,还有一种办法是使用九宫格. 但利用九宫格有一个缺点,那就是每个格子的宽高是一样的,如果一定要使用九宫格来展示,那么展示的商品图片可能会变形. 为了保证商品图片能够按照原来的宽高比进行展示,一般采用的是瀑布流的方式. 2.瀑布流的特点: 由很多的格子组成,但是每个格子的宽度和高速都是不确定

iOS开发备忘录:自定义UINavigationBar背景图片和Back按钮

iOS项目,根据设计图,有时需要自定义UIView的UINavigationBar的背景.可以切出来一张1像素左右的背景图片,来充当UINavigationBar的背景. 可以利用NavigationBar的- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics方法将图片填充NavigationBar的背景. 具体代码可参考: [self.navigationCont

iOS开发 --UITableviewCell的自定义与计算frame

一.UITableViewCell简介 UITableView上的每一行的内容都是UITableViewCell来显示的,通过 UITableViewDataSource的协议方法:tableView:cellForRowAtIndexPath:来初始化要显示的内容.而 UITableViewCell则是通过它自带的contentView来显示,每个Cell都默认有个子视图contentView,所以每个cell 上显示的内容都是加在这个视图上. 系统的UITableViewCell有四种类型

iOS开发UI之自定义View

1. 通过代码自定义View,创建一个View类(继承UIView),一个View中包含一个UIImageView和一个UILabel 外界用alloc] init]方法创建对象时,系统默认会自动调用initWithFrame:(CGRect)frame方法,所以要创建对象View中的子控件需要重写initWithFrame:(CGRect)frame方法,在这个方法中来创建子控件,但不能对其根据创建这个类创建出来的对象尺寸来设置,需要调用 - (void)layoutSubviews 这个方法