首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS-自定义View的封装

开发过程自定义控件使用的频率非常高,接下来简单对自定义控件做个小结 View的封装 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件创建封装起来,不让外界看见 外界可以传入对应的数据模型给...view,view拿到模型数据后给内部子控件设置对应的数据 代码封装 新建一个继承UIView的类 initWithFrame:方法添加子控件(也可以使用懒加载) 重写模型属性set方法,set方法设置模型属性到子控件上...layoutSubviews方法设置子控件的frame(一定要调用[super layoutSubviews]) 关于layoutSubviews以下情况下会被调用: - init初始化不会触发...的比较 调整子控件的frame,使用纯代码比xib更灵活,子控件可以layoutSubviews方法灵活调整自己的frame。...而用xib相对于比较死板,但是更简单,更方便 自定义UIView,如果该View一直一个样式,推荐使用xib,简单方便 而子控件经常随着父控件变化而变化,推荐使用纯代码,灵活多变

25110

layoutSubviews解析

1.layoutSubviews的触发 1、 init初始化不会触发layoutSubviews。 2、 addSubview会触发layoutSubviews。...3、 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。 4、 滚动一个UIScrollView会触发layoutSubviews。...5、 旋转Screen会触发父UIView上的layoutSubviews事件。 6、 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。 7....iOS5.1或之前的版本,这个方法什么也没干.这个方法的默认实现是 用参数来设定subviews的尺寸和位置的 ....如果你需要更加精确的布局,可以子类里面重写这个方法.仅仅在以下情况下:自动布局达不到你想要效果你才有必要重写这个方法.你可以直接设置subviews的尺寸.

21320
您找到你想要的搜索结果了吗?
是的
没有找到

【iOS 开发】从 setNeedsLayout 说起

> ,而应该在你认为系统默认的布局和重绘不能带给你想要的效果子类重写这些方法,然后分别通过 setNeedsLayout 和 setNeedsDisplayInRect...---- 如何善用 View Drawing Cycle 一个很常见的例子是,一个 iPad App,横屏和竖屏界面布局不一样,那么你可以监听设备旋转,设备旋转执行 setNeedsLayout...所以重要的其实是了解何时会触发 layoutSubviews: init 初始化不会触发 layoutSubviews addSubview 会触发 layoutSubviews...会触发父 UIView 上的 layoutSubviews 事件 改变一个 UIView 大小的时候也会触发父 UIView 上的 layoutSubviews 事件 然后按 Apple 要求的方式来做就好了...那么如果我想要这个直线一直根据两个点同步变化的话,就需要在 dotView 的位置发生改变执行: lineView.setNeedsDisplay() // 重绘 lineView

68810

UI篇-VC的生命周期以及UIViewlayoutSubviews和drawRect方法

一个VC 执行viewWillDisappear 或者viewDidDisappear 方法都是出栈之后才执行的,也就是说 已经不在 self.navigationController 的viewControllers...VC绘制UI的时候,它不同于 UIViewUIView init方法调用后,UIView就已经绘制好(初始化好了)。...但是VC,当前UIView的是 viewDidLoad 执行后才初始化好的,所以我们会见到这样一个Bug,VC初始化语句后面调用 一个 VC的绘制UI的方法,你会发现根本没有效果,这就是因为,VC...UIView中方法的执行顺序大概是这样的: init 方法 >>属性的set/get 方法>> layoutSubviews(当然是要达到触发条件)>>drawRect, 使用得当可以View的调用起到很好的效果...layoutSubviews以下情况下会被调用: 1、init初始化不会触发layoutSubviews。 2、addSubview会触发layoutSubviews

1.8K30

App的生命周期

注意: 不要在这里做View相关操作,ViewloadView方法初始化。...initWithCoder: 如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发自动初始化,因此方法...loadView 当执行到loadView方法,如果视图控制器是通过nib创建,那么视图控制器已经从nib文件中被解档并创建好了,接下来任务就是对view进行初始化。...比如,设置设备不同方向如何显示;设置状态栏方向、设置视图显示样式等。...removeFromSuperview、dealloc 两个方法,layoutSubviews 子视图布局变动时会多次调用,所以可以 removeFromSuperview、dealloc 这两个方法执行释放内存等操作

1.2K10

UIViewController生命周期

二、生命周期 0、init UIViewController-init不要出现创建view的代码。良好的设计,init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。...无论是从nib文件加载,还是通过纯代码编写界面,viewDidLoad方法都会执行。我们可以重写这个方法,对通过nib文件加载的view做一些其他的初始化工作。...Screen会触发父UIView上的layoutSubviews 改变transform属性,当然frame也会变 处于key window的UIView才会调用(程序同一间只有一个window为keyWindow...Suspended挂起:程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起,程序还是停留在内存的,当系统内存低,系统就把挂起的程序清除掉,为前台程序提供更多的内存。...生命周期: application didFinishLaunchingWithOptions:当应用程序启动执行,应用程序启动入口,只应用程序启动执行一次。

1.9K10

谈谈 Autolayout

这个方法很开销很大,因为它会在每个子视图上起作用并且调用它们相应的 layoutSubviews 方法。注意:最好不要在代码手动调用 layoutSubviews 方法。...updateConstraints 系统更新约束,注意:最好不要在代码手动调用 updateConstraints 方法。...通常在 updateConstraints 方法实现必须要更新的约束,设置或者解除约束、更改约束的优先级或者常量值,或者从视图层级移除一个视图都会设置一个内部的标记 update constarints...,如果将 layer 的初始化与 view 的初始化放在一个方法; 比如: layer.bounds = CGRectMake(0,0,view.bounds.size.widith * 0.5,50...才会对视图的尺寸进行修改,而 layout 通常是视图已经加载到父视图上面做出响应。

68920

layoutSubviews 详解

以下情况下会被调用: 1、init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero,也会触发 2、addSubview...5、旋转Screen会触发父UIView上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 苹果的官方文档强调...layoutSubviews, 当我们某个类的内部调整子视图位置,需要调用。 反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。...”的,可以直接调用[view layoutIfNeeded] 重绘 -drawRect:(CGRect)rect方法:重写此方法,执行重绘任务 -setNeedsDisplay方法:标记为需要重绘...对subviews重新布局 layoutSubviews方法调用先于drawRect setNeedsLayoutreceiver标上一个需要被重新布局的标记,系统runloop的下一个周期自动调用

45930

自定义View

自定义View 通过纯代码自定义控件 继承自系统自带的控件,写一个属于自己的控件 .h 文件声明模型对象 @class@property(nonatomic,strong)Shop *shop;...目的:封装控件内部的细节,不让外界关心 步骤 新建一个继承UIView的类 initWithFrame:方法添加子控件 当控件第一次创建或者通过 init 和initWithFrame...]; [self addSubview:shopLabel]; _shopLabel = shopLabel; } return self; } - layoutSubviews...方法设置子控件的frame - 一定要调用[super layoutSubviews]; /** * 当前控件的frame发生改变的时候就会调用 * 第一次显示也会调用 * 这个方法专门用来布局子控件...= [UIImage imageNamed:shop.icon]; self.shopLabel.text = shop.namelabel; } 通过xib自定义控件 新建一个继承UIView

72060

View编程指南(三)

view controller中使用nib文件,只需使用nib文件信息初始化view controller即可。view controller适当的时候处理view的加载和卸载。...contentMode和contentStretch属性确定在view的宽度或高度更改时如何处理内容。 contentScaleFactor属性仅在需要为高分辨率屏幕自定义view的绘制行为时使用。...如果以编程方式构建view,则将view创建代码放置view controller的loadView方法。...您可以自定义view实现layoutSubviews方法,当自动执行行为本身不会产生所需的结果。此方法的实现可以执行以下任何操作: 调整任何直接subview的大小和位置。...当tile从view的可见区域滚出layoutSubviews方法将tile移动到传入边缘,替换进程的内容。

1.7K30

iOS项目——自定义UITabBar与布局

在上一篇文章iOS项目——基本框架搭建中,我们详细说明了如何对TabBarItem的图片属性以及文字属性进行一些自定义配置。...TabBar的.m文件的主要内容,主要是重写其 layoutSubviews 方法,该方法我们是将四个按钮的大小和布局进行了调整,然后最中间添加一个【发布】按钮。...同样的,也有几点需要注意的: 【发布】按钮的初始化还是和上面一样,应该采用单例模式进行初始化,具体就不展开; 重写  方法,应该先调用其父类的此方法 [super layoutSubviews]; ,...TabBar加载TabBarItem是 viewDidLoad 之后执行,我们自定义TabBar进行断点调试,发现确实是先运行XMGTabBarController的 viewDidLoad方法,...3 添加红点提示   现在很多App的TabBarItem在有新消息右上角会有一个红点提示,有的甚至还会有具体数目的提醒,类似我们常用的QQ、微信、微博、头条等都会有类似的功能,这个提示iOS的学名叫做

2.9K90

layoutSubviews总结

在下面情况下会被调用: 1、init初始化不会触发layoutSubviews 可是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero,也会触发 2、addSubview...5、旋转Screen会触发父UIView上的layoutSubviews事件 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 苹果的官方文档强调...layoutSubviews, 当我们某个类的内部调整子视图位置,须要调用。 反过来的意思就是说:假设你想要在外部设置subviews的位置,就不要重写。...) 假设要立即刷新,要先调用[view setNeedsLayout],把标记设为须要布局,然后立即调用[view layoutIfNeeded],实现布局 视图第一次显示之前,标记总是“须要刷新...对subviews又一次布局 layoutSubviews方法调用先于drawRect setNeedsLayoutreceiver标上一个须要被又一次布局的标记,系统runloop的下一个周期自己主动调用

22620

手把手带你撸一个网易云音乐首页(三)

View 回到我们的项目工程来,准备构建我们的表视图。 首先,我们的首页视图控制器 DiscoveryViewController 创建存储属性 HomeViewModel 并初始化它。...我们实际开发过程,数据请求的操作必不可少,必须要先将数据提供给 ViewModel,然后在数据更新重新 Reload TableView。...但是,通过观察你会发现它的 UI 样式其实是有讲究的,就是同一个页面,它的第二个 item 也需要露出一部分,这该如何去实现呢!...我们知道 UICollectionView 的属性,有一个分页的属性:isPagingEnabled,当设置成 true ,每次滚动的位移量等于它自身 frame 的宽度;当不设置这个分页属性,它的默认值是...不过,由于搜索栏需要自定义一些样式,我们可以先定义一个 UISearchController 的成员变量,将它的属性初始化好以后,再进行赋值,代码如下: self.searchController

2.3K10

setNeedsLayout和layoutIfNeeded看我就懂!

当这样的约束被更新,它会自动执行相当于setNeedsLayout的操作,因此在下一个更新周期内不需要更新视图。我们可以没有更多的代码,你会看到更新,但它不会有动画效果。...但在我们的例子,添加了2秒的动画块UIView.animate,该块内,我们通过layoutIfNeeded方法强制立即布局。...由于此布局同步发生,因此动画块捕获来自约束更改的帧移动,因此如果您现在运行应用程序,则可以看到红色视图2秒钟内如何变大变小。 效果如下: ?...相反,setNeedsLayout方法返回,视图只是列表,以在下一个更新周期中进行更新。净效果是动画块不会发生动画,因为该块的视图没有更改。 效果如下: ?...但是,我们没有动画块的上下文中进行视图更新,也就是说刚好是一个周期,所以它似乎是立即的,跟没有UIView.animate这段代码效果是一样的。

2.6K90
领券