UIView不可不知的秘密

前言:

1、在Mac OS中NSWindow的父类是NSResponder,而在iOS中UIWindow的父类是UIView。程序一般只有一个窗口但是会又很多视图。 2、UIView的作用:描画和动画,视图负责对其所属的矩形区域描画、布局和子视图管理、事件处理、可以接收触摸事件、事件信息的载体等等。

我在前面详细介绍了setNeedsDisplaysetNeedsLayout和layoutIfNeeded 详情请点击。

下面介绍的是view添加以及删除时所触发的方法

// 当视图添加子视图时调用 - (void)didAddSubview:(UIView *)subview; // 当子视图从本视图移除时调用 - (void)willRemoveSubview:(UIView *)subview; // 当视图即将加入父视图时 / 当视图即将从父视图移除时调用 - (void)willMoveToSuperview:(nullable UIView *)newSuperview; // 当试图加入父视图时 / 当视图从父视图移除时调用 - (void)didMoveToSuperview; // 当视图即将加入父视图时 / 当视图即将从父视图移除时调用 - (void)willMoveToWindow:(nullable UIWindow *)newWindow; // 当视图加入父视图时 / 当视图从父视图移除时调用 - (void)didMoveToWindow;

上面是资料说的,究竟对不对呢?我们用swift版的代码来验证下。

先自定义一个<code>TestView</code>类 TestView代码如下:

override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

// 当试图加入父视图时 / 当视图从父视图移除时调用
override func didMoveToSuperview() {
    print("\(#function)")
}
// 当视图即将加入父视图时 / 当视图即将从父视图移除时调用
override func willMove(toSuperview newSuperview: UIView?) {
    print("\(#function)")

}

override func didAddSubview(_ subview: UIView) {
    print("3秒后\(#function)")

}
override func willRemoveSubview(_ subview: UIView) {
    print("6秒后\(#function)")
}

然后将该TestView创建实例,添加到控制器的view,设背景色为紫色,并将001赋给tag值

override func viewDidLoad() {
    super.viewDidLoad()
    
    let testV = TestView()
    testV.frame = self.view.bounds
    testV.backgroundColor = UIColor.purple
    testV.tag = 001
    self.view.addSubview(testV)

上面方法触发了willMove(toSuperview:)didMoveToSuperview(),验证了当视图即将加入父视图时和当试图加入父视图时调用

之后在viewDidLoad添加一个带有延迟的添加红色view代码,值得一提的是,这是最新swift3.1的GCD延时方法 //如果不需要在主线程执行,就去掉main

DispatchQueue.main.asyncAfter(deadline: .now()+3.0) {
    let view = UIView.init(frame: CGRect(x: 10, y: 100, width: 100, height: 60))
    view.backgroundColor = UIColor.red
    testV.addSubview(view)    
}

上面方法触发了didAddSubview,验证了当视图添加子视图时会调用

DispatchQueue.main.asyncAfter(deadline: .now()+6.0, execute: {
    let tagView: TestView = self.view .viewWithTag(001) as! TestView
    tagView.removeFromSuperview()
})

上面方法触发了willRemoveSubview,验证了当子视图从本视图移除时会被调用,同时,willMove(toSuperview:)didMoveToSuperview()也被调用了,分别验证了当视图即将从父视图移除时 和 当视图从父视图移除时会被调用

经证实,资料所述属实。 人家发现的即便是对,但终归是人家的,只有自己验证才是属于自己的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王大锤

iOS8 UICollectionView横向滑动demo

44760
来自专栏无所事事者爱嘲笑

h5软键盘挡住输入框问题解决(android)

在部分android机型上测试点击靠下的输入框时遇到弹出的软键盘挡住输入框问题,ios可自身弹起(ios自身的调整偶尔也会出问题,例如第三方键盘会遮挡,原因是第...

78810
来自专栏web前端

02移动端布局

  一、rem      1、意义:当px固定宽度不能适应不同屏幕尺寸时,布局需要,从而产生rem      2、rem 和 em 区别           2...

21890
来自专栏哈雷彗星撞地球

iOS 知识小集(Status Bar变换)

iOS 中经常会有需要在某个界面改变状态栏颜色或者某个界面隐藏状态栏的需求。而改变状态栏颜色和控制状态栏显示和隐藏的API,在iOS 的不同版本中也发生了很多变...

8820
来自专栏hrscy

iOS常见问题总结(二)

在导入框架libxml2.2.dylib后, 最到了XCode仍然找不到<libxml/tree.h>的情况, 最后解决过程如下: 1 )项目 -Targ...

11820
来自专栏谈补锅

浏览器音频兼容和ffmpeg的音频转码使用

1、百度搜索浏览器对于音频文件的兼容,排在前面的文章大部分是复制粘贴很久以前的文章,容易误导搜索资料的人,

31230
来自专栏游戏杂谈

AS3给图片加水印文字

通过FileReference获取选中的图片,调用它的load方法,将图片存入到内存中。使用Loader(flash.display.Loader)类的loa...

12220
来自专栏技术总结

iOS实用_可点击部分文字label

1K80
来自专栏iOS开发攻城狮的集散地

iOS屏幕旋转

25960
来自专栏编程坑太多

react-native总结心得

15820

扫码关注云+社区

领取腾讯云代金券