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)。
![](https://img.haomeiwen.com/i13883177/c1c66818dffb2e61.png)
还有一些常用的控件属性需要间接获取和修改,比较麻烦且不够直观,例如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
}
}
}
网友评论