UIView的常见使用方法

zPosition

此属性默认值为0,该属性影响图层的前后顺序,当两个UIView重叠时,zPosition较高的一方显示在上面,但是不改变事件传递的顺序。

frame,bounds,center的区别

  • frame:视图在其父视图中的位置和大小。
  • bounds:视图在其自身坐标系统中的位置和大小,位置默认为(0,0)。
  • center:视图的中心点在其父视图中的位置。

内边距

切换到Size inspector,设置Layout Margins为Fixed,然后设置上下左右的边距,最后在使用约束时选择Relative to margin即可。

hitTest

hitTest是UIView的一个方法,该方法会被系统调用,用于在视图中找到一个最适合的UIView来响应触摸事件。

hitTest通过调用pointInside方法判断触摸点是否在视图内,当触摸点超过视图范围时,视图返回nil不处理触摸事件,所以当子视图超过父视图范围时虽然可见但是不能响应触摸事件,如果需要响应超出部分的触摸事件,需要重写父视图的hitTest方法。

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if (!isUserInteractionEnabled || isHidden || alpha <= 0.01 ){
            return nil
        }
        var view=super.hitTest(point, with: event)
        if view==nil{
            let p=button.convert(point, from: self)
            if let hitView=button.hitTest(p, with: event){
                view=hitView
            }
        }
        return view
    }

扩展UIView

对于一些常用的控件属性,例如边框颜色,边框宽度,圆角半径要想在Storyboard中修改,只能通过用户自定义的运行时属性来实现,这种方式用起来比较麻烦,我们可以通过@IBInspectable为UIView添加自定义属性(@IBDesignable不支持extension)。
UIView的常见使用方法_第1张图片

还有一些常用的控件属性需要间接获取和修改,比较麻烦且不够直观,例如width,height等,我们可以为UIView添加这些扩展属性。

extension UIView{
    
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue/UIScreen.main.scale
            
        }
        get {
            return layer.borderWidth*UIScreen.main.scale
        }
    }
    
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
        }
        get {
            return layer.cornerRadius
        }
    }
    
    @IBInspectable var borderColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            layer.borderColor = uiColor.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
    
    public var left:CGFloat {
        get {
            return self.frame.origin.x
        }
        set(newLeft) {
            var frame = self.frame
            frame.origin.x = newLeft
            self.frame = frame
        }
    }
    
    public var top:CGFloat {
        get {
            return self.frame.origin.y
        }
        
        set(newTop) {
            var frame = self.frame
            frame.origin.y = newTop
            self.frame = frame
        }
    }
    
    public var width:CGFloat {
        get {
            return self.frame.size.width
        }
        
        set(newWidth) {
            var frame = self.frame
            frame.size.width = newWidth
            self.frame = frame
        }
    }
    
    public var height:CGFloat {
        get {
            return self.frame.size.height
        }
        
        set(newHeight) {
            var frame = self.frame
            frame.size.height = newHeight
            self.frame = frame
        }
    }
    
    public var right:CGFloat {
        get {
            return self.left + self.width
        }
    }
    
    public var bottom:CGFloat {
        get {
            return self.top + self.height
        }
    }
    
    public var centerX:CGFloat {
        get {
            return self.center.x
        }
        
        set(newCenterX) {
            var center = self.center
            center.x = newCenterX
            self.center = center
        }
    }
    
    public var centerY:CGFloat {
        get {
            return self.center.y
        }
        
        set(newCenterY) {
            var center = self.center
            center.y = newCenterY
            self.center = center
        }
    }
}

你可能感兴趣的:(iOS)