底层浅谈:什么是视图?

我最开始的理解 就是我们能在app上看到的一切,从状态栏,导航栏,到弹窗对话框。
但是我们如何定义这些视图(比如视图中的控件是什么,位置在哪里,当前视图是否包含子视图,此视图和其他视图之间有哪些交互,对应的方法是怎么样的)?这个问题一直没有得到解决,而处于似懂非懂的状态。
下面就从头讲一下什么是视图。

说到视图,就是UIView,他是UIKit框架里面最基础的视图类,UIView类定义了一个矩形的区域,并管理该矩形区域内的所有屏幕显示。
UIView类负责定义了视图的基本行为,但并不定义其视觉表现, 而是UIKit这个父类来表现,通过其子类来为文本框,按键及工具条这样的标准界面元素定义具体的外观和行为。

UIView类,其实是一个很general的父类,其大量的子类实现了各种具体的功能。见下图:
在这里插入图片描述
我们来分析一下这个类之间的继承关系:
首先NSObject是一个根类,几乎所有的类都是从它派生出来根类拥有所有类都有的方法,如alloc和init
然后就是UIView视图类,UIView视图是所有控件的父类(当然也是很多其他类的父类),控件用于响应用户的交互,而UIView则负责内容的显示和布局。
UIView的子类中,含有UIResponsder, UIWindow, UICOntroller, 警告视图和动作表单类。

  1. UIResponsder可以让继承它的类响应移动设备的触摸事件,由于可能有多个对象响应同一个事件,iOS将事件沿着响应链向上传递
  2. UIWindow 提供了一个用于管理和显示视图的窗口。窗口提供一个描画内容的表面,是所有其他视图的根容器。每个应用程序通常都只有一个窗口
  3. UIControl 类几乎是所有交互控件的父类,如按钮,滑块,文本框等。所以UIControl 类负责根据触摸事件触发响应的动作
  4. 警告视图和动作表单都可以用于提示用户。它们向用户显示一条消息和一个或多个可选的按键,用户通过这些选项来响应消息。

UIView类有很多属性,外观属性,几何属性,交互属性,表示嵌套和层次关系的方法等等。

  • UIView的外观属性
    UIView类的外观属性常用的主要有背景颜色,切边,同名度,显示和隐藏
        let view=UIView(frame:CGRect(x:10,y:30,width:300,height:200))
        view.backgroundColor=UIColor.red//背景颜色
        view.clipsToBounds=true//切边
        view.alpha=0.4//透明度
        view.isHidden=false//是否显示隐藏
        self.view.addSubview(view)
  • UIView的几何属性

UIView的frame(origin,size)属性:定义了一个矩形,描述一个UIView的大小和在父坐标的位置
UIView的bounds(origin,size)属性:同样定义了一个矩形,描述一个UIView的大小和自身坐标原点的位置。bounds. origin属性默认值时(0,0),而bounds.size和frame.size是一致的
UIView的center属性:用于确定一个视图的中心位置,参照其父视图的坐标系统。在对视图进行放大,缩小或者旋转,该属性的值不会改变

  • UIView的交互属性
    设置UIView的isUserInteractionEnabled,可以激活用户的交互特性。
  //创建UIView视图
        let view=UIView(frame:CGRect(x:10,y:30,width:300,height:200))
        view.backgroundColor=UIColor.red//背景颜色
        view.clipsToBounds=true//切边
        view.alpha=0.4//透明度
        view.isHidden=false//是否显示隐藏
        
        
        let  tap=UITapGestureRecognizer(target:self,action:#selector(onetap))
        view.addGestureRecognizer(tap)
    
        self.view.addSubview(view)
       @objc func onetap() {
        
          print("呵呵")
      }

结果就是,一点击,就打印出呵呵。

  • UIView的嵌套和层次关系
    这些都是由UIView中的方法来对嵌套和层次进行管理。
    下面就是这些方法:
    insertSubview(view,at:) 在指定的位置插入视图
    insertSubview(UIView, aboveSubview: UIView) 将视图添加到指定视图的上方
    insertSubview(UIView, belowSubview: UIView) 将视图添加到指定视图的下方
    bringSubview(toFront: view1) 将指定的子视图移动到最前面
    bringSubview(toFront: view1) 将指定的子视图移动到最后面
    exchangeSubview(at: 0, withSubviewAt: 1) 交换两个指定位置的子视图在父类的位置
    removeFromSuperview() 将子视图从父类中移除

示例:

 //创建UIView视图
        let view=UIView(frame:CGRect(x:10,y:30,width:300,height:200))
        view.backgroundColor=UIColor.red//背景颜色
        view.clipsToBounds=true//切边
        view.alpha=0.4//透明度
        view.isHidden=false//是否显示隐藏
        self.view.addSubview(view)
 
        let view1=UIView(frame:CGRect(x:110,y:30,width:100,height:200))
        view1.backgroundColor=UIColor.green
        self.view.addSubview(view1)
        let tap=UITapGestureRecognizer(target:self,action:#selector(onetap))
        view1.addGestureRecognizer(tap)
//        self.view.insertSubview(view1, at: 1)//将视图插入指定的位置
//        self.view.insertSubview(view1, aboveSubview: view)//将视图插入某个视图的上方
//        self.view.insertSubview(view1, belowSubview: view)//将视图插入某个视图的下方
//        self.view.bringSubview(toFront: view1)//将指定的子视图移动到最前面
//        self.view.bringSubview(toFront: view1)//将指定的子视图移动到最后面
          self.view.exchangeSubview(at: 0, withSubviewAt: 1)//交换两个指定位置的子视图在父类的位置
//        view1.removeFromSuperview()//将子视图从父类中移除
posted @ 2020-07-16 00:44  EvanMeetTheWorld  阅读(94)  评论(0)    收藏  举报