在开发过程中,自定义控件使用的频率非常高,接下来简单对自定义控件做个小结 View的封装 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部的子控件创建封装起来,不让外界看见 外界可以传入对应的数据模型给...view,view拿到模型数据后给内部子控件设置对应的数据 代码封装 新建一个继承UIView的类 在initWithFrame:方法中添加子控件(也可以使用懒加载) 重写模型属性set方法,在set方法中设置模型属性到子控件上...在layoutSubviews方法中设置子控件的frame(一定要调用[super layoutSubviews]) 关于layoutSubviews在以下情况下会被调用: - init初始化不会触发...的比较 在调整子控件的frame时,使用纯代码比xib更灵活,子控件可以在layoutSubviews方法中灵活调整自己的frame。...而用xib相对于比较死板,但是更简单,更方便 自定义UIView时,如果该View一直一个样式,推荐使用xib,简单方便 而子控件经常随着父控件变化而变化,推荐使用纯代码,灵活多变
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的尺寸.
> ,而应该在你认为系统默认的布局和重绘不能带给你想要的效果时,在子类中重写这些方法,然后分别通过 setNeedsLayout 和 setNeedsDisplayInRect...---- 如何善用 View Drawing Cycle 一个很常见的例子是,一个 iPad App,横屏和竖屏时界面布局不一样,那么你可以监听设备旋转,在设备旋转时执行 setNeedsLayout...所以重要的其实是了解何时会触发 layoutSubviews: init 初始化不会触发 layoutSubviews addSubview 会触发 layoutSubviews...会触发父 UIView 上的 layoutSubviews 事件 改变一个 UIView 大小的时候也会触发父 UIView 上的 layoutSubviews 事件 然后按 Apple 要求的方式来做就好了...那么如果我想要这个直线一直根据两个点同步变化的话,就需要在 dotView 的位置发生改变时,执行: lineView.setNeedsDisplay() // 重绘 lineView
一个VC 在执行viewWillDisappear 或者viewDidDisappear 方法时都是出栈之后才执行的,也就是说 已经不在 self.navigationController 的viewControllers...VC绘制UI的时候,它不同于 UIView,UIView中 init方法调用后,UIView就已经绘制好(初始化好了)。...但是在VC中,当前UIView的是在 viewDidLoad 执行后才初始化好的,所以我们会见到这样一个Bug,在VC初始化语句后面调用 一个 VC的绘制UI的方法,你会发现根本没有效果,这就是因为,VC...UIView中方法的执行顺序大概是这样的: init 方法 >>属性的set/get 方法>> layoutSubviews(当然是要达到触发条件)>>drawRect, 使用得当可以在View的调用中起到很好的效果...layoutSubviews在以下情况下会被调用: 1、init初始化不会触发layoutSubviews。 2、addSubview会触发layoutSubviews。
注意: 不要在这里做View相关操作,View在loadView方法中才初始化。...initWithCoder: 如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法...loadView 当执行到loadView方法时,如果视图控制器是通过nib创建,那么视图控制器已经从nib文件中被解档并创建好了,接下来任务就是对view进行初始化。...比如,设置设备不同方向时该如何显示;设置状态栏方向、设置视图显示样式等。...removeFromSuperview、dealloc 两个方法,layoutSubviews 在子视图布局变动时会多次调用,所以可以在 removeFromSuperview、dealloc 这两个方法中执行释放内存等操作
学习了一下UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。...要实现上述布局,主要是运用UIView中 layoutSubviews方法。...当UIView设置为自动适配屏幕时,当用户旋转设备的时候,会调用layoutSubviews方法,我们只需重写 这个方法,然后判断用户屏幕的方向。在调整每个空间的位置即可。...同样在ArticleView中设置横竖屏相应空间的坐标即可。...layoutSubviews在以下情况下会被调用: 1、init初始化不会触发layoutSubviews 2、addSubview会触发layoutSubviews 3、设置view的Frame
二、生命周期 0、init UIViewController-init不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。...无论是从nib文件加载,还是通过纯代码编写界面,viewDidLoad方法都会执行。我们可以重写这个方法,对通过nib文件加载的view做一些其他的初始化工作。...Screen会触发父UIView上的layoutSubviews 改变transform属性时,当然frame也会变 处于key window的UIView才会调用(程序同一时间只有一个window为keyWindow...Suspended挂起:程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。...生命周期: application didFinishLaunchingWithOptions:当应用程序启动时执行,应用程序启动入口,只在应用程序启动时执行一次。
系统在很多时候会去调用这个方法: 1.初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发。...layoutSubviews 5.旋转Screen会触发父UIView上的layoutSubviews事件 6.改变UIView大小的时候也会触发父UIView上的layoutSubviews事件 在苹果的官方文档中强调...当我们在某个类的内部调整子视图位置时,需要调用。...所以我们需要在动画中调用这个方法layoutIfNeeded所以代码应该这么写 leftContrain.constant = 100 UIView.animateWithDuration(0.8,...drawRect在以下情况下会被调用: 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。
这个方法很开销很大,因为它会在每个子视图上起作用并且调用它们相应的 layoutSubviews 方法。注意:最好不要在代码中手动调用 layoutSubviews 方法。...updateConstraints 系统更新约束,注意:最好不要在代码中手动调用 updateConstraints 方法。...通常在 updateConstraints 方法中实现必须要更新的约束,在设置或者解除约束、更改约束的优先级或者常量值,或者从视图层级中移除一个视图时都会设置一个内部的标记 update constarints...,如果将 layer 的初始化与 view 的初始化放在一个方法中; 比如: layer.bounds = CGRectMake(0,0,view.bounds.size.widith * 0.5,50...才会对视图的尺寸进行修改,而 layout 通常是在视图已经加载到父视图上面时做出响应。
LayoutSubviews 子类可以重写此方法,因为需要更精确执行他们子视图的布局。...5旋转Screen会触发父UIView上的layoutSubviews事件。 6改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。...7.removeFromSuperview PS: init初始化不会触发layoutSubviews drawRect 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect...4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect PS: 重绘操作在drawRect方法中完成,不建议直接调用drawRect方法,当然调用此方法,结果没有任何效果的...我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用drawRect方法进行重绘。
在以下情况下会被调用: 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 setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用
自定义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
在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移动到传入边缘,替换进程中的内容。
在上一篇文章iOS项目——基本框架搭建中,我们详细说明了如何对TabBarItem的图片属性以及文字属性进行一些自定义配置。...TabBar的.m文件的主要内容,主要是重写其 layoutSubviews 方法,在该方法中我们是将四个按钮的大小和布局进行了调整,然后在最中间添加一个【发布】按钮。...同样的,也有几点需要注意的: 【发布】按钮的初始化还是和上面一样,应该采用单例模式进行初始化,具体就不展开; 重写 方法时,应该先调用其父类的此方法 [super layoutSubviews]; ,...TabBar加载TabBarItem是在 viewDidLoad 之后执行,我们在自定义TabBar时进行断点调试,发现确实是先运行XMGTabBarController的 viewDidLoad方法,...3 添加红点提示 现在很多App的TabBarItem在有新消息时在右上角会有一个红点提示,有的甚至还会有具体数目的提醒,类似我们常用的QQ、微信、微博、头条等都会有类似的功能,这个提示在iOS中的学名叫做
在下面情况下会被调用: 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 setNeedsLayout在receiver标上一个须要被又一次布局的标记,在系统runloop的下一个周期自己主动调用
*)newSuperview - (void)didmovetosuperview - (void)removeFromSuperview - (void)dealloc 但是在移出时newWindow...2.包含子控件的UIView 当增加一个子控件时,就会执行 didaddsuperrview,之后也会执行一次layoutsubview。...在view释放后,执行完,dealloc就会多次执行willremovsubview.先add的view,先释放掉。...3.layoutsubview 在上面的方法中,经常发现layoutsubview会被调用,下面说下layoutsubview的调用情况: 1、addSubview会触发layoutSubviews,...其中的原理是:执行setNeedsLayout后会在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews。
View 回到我们的项目工程中来,准备构建我们的表视图。 首先,在我们的首页视图控制器 DiscoveryViewController 中创建存储属性 HomeViewModel 并初始化它。...在我们实际开发过程中,数据请求的操作必不可少,必须要先将数据提供给 ViewModel,然后在数据更新时重新 Reload TableView。...但是,通过观察你会发现它的 UI 样式其实是有讲究的,就是在同一个页面中,它的第二个 item 也需要露出一部分,这该如何去实现呢!...我们知道在 UICollectionView 的属性中,有一个分页的属性:isPagingEnabled,当设置成 true 时,每次滚动的位移量等于它自身 frame 的宽度;当不设置这个分页属性,它的默认值是...不过,由于搜索栏需要自定义一些样式,我们可以先定义一个 UISearchController 的成员变量,将它的属性初始化好以后,再进行赋值,代码如下: self.searchController
当这样的约束被更新时,它会自动执行相当于setNeedsLayout的操作,因此在下一个更新周期内不需要更新视图。我们可以没有更多的代码,你会看到更新,但它不会有动画效果。...但在我们的例子中,添加了2秒的动画块UIView.animate,在该块内,我们通过layoutIfNeeded方法强制立即布局。...由于此布局同步发生,因此在动画块中捕获来自约束更改的帧移动,因此如果您现在运行应用程序,则可以看到红色视图在2秒钟内如何变大变小。 效果如下: ?...相反,setNeedsLayout方法返回,视图只是在列表中,以在下一个更新周期中进行更新。净效果是在动画块中不会发生动画,因为该块中的视图没有更改。 效果如下: ?...但是,我们没有在动画块的上下文中进行视图更新,也就是说刚好是一个周期,所以它似乎是立即的,跟没有UIView.animate这段代码效果是一样的。
} -(void)awakeFromNib { [super awakeFromNib]; NSLog(@"FirstVC awakeFromNib"); } 请注意:为了保证代码顺利执行...,且保证模拟器顺利加载ViewController,请务必添加[super viewxxxxx]的代码来初始化。...viewWillLayoutSubviews调用情况分析 init初始化不会触发layoutSubviews addSubview会触发layoutSubviews 设置view的Frame会触发layoutSubviews...,当然前提是frame的值设置前后发生了变化 滚动一个UIScrollView会触发layoutSubviews 旋转Screen会触发父UIView上的layoutSubviews事件 改变一个UIView...大小的时候也会触发父UIView上的layoutSubviews事件
要发到layoutSubviews方法末尾位置 在自定义子View中使用layoutSubviews时应注意,[superlayoutSubviews];最好放在方法默认最后执行,不然IOS7下面可能引起挂机...只有部分显示在ImageView中。...UITouch对象在触摸操作的过程中在不断变化,所以在使用UITouch对象时,不能直接retain,而需要使用其他手段存储UITouch的内部信息。...view中,返回在目标视图view中的rect •- (CGRect)convertRect:(CGRect)recttoView:(UIView*)view; •//将rect从view中转换到当前视图中...= [self.viewconvertRect:cell.btn.framefromView:cell]; 6//此rc为btn在controllerA中的rect 7 8或当已知btn时:
领取专属 10元无门槛券
手把手带您无忧上云