我创建自定义的平行四边形视图,视图渲染罚款默认偏移值。但是,当我从IB改变它的偏移值不工作
@IBDesignable class CustomParallelogramView: UIView {
@IBInspectable var offset: Float = 10.0
var path = UIBezierPath()
lazy var shapeLayer: CAShapeLayer = {
let layer = CAShapeLayer()
layer.path = path.cgPath
return layer
}()
override init(frame: CGRect) {
super.init(frame:frame)
drawParallelogram()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder:aDecoder)
drawParallelogram()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
drawParallelogram()
}
override func layoutSubviews() {
super.layoutSubviews()
updateFrame()
}
func drawParallelogram() {
print(offset)
path.move(to: CGPoint(x: bounds.minX + CGFloat(offset), y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.maxX - CGFloat(offset), y: bounds.maxY))
path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))
path.close()
self.layer.mask = shapeLayer
}
func updateFrame() {
shapeLayer.frame = bounds
}
}
我从IB改变偏移值,但它不会改变IB和模拟器
一对夫妇的想法:
drawParallelgram
观察者调用offset
。layoutSubviews
,您更新了形状图层的frame
。要重置其path
并再次更新你的面具。UIBezierPath
。你可能只是想使它成为一个局部变量,避免增加越来越多的笔触到现有路径。prepareForInterfaceBuilder
提出这个方法的目的,一些误解。这不是从IB启动时做初始化。这是做了一些特殊的配置,超出什么是由init
方法,通过IB要求已经完成。
例如。如果你有一个复杂的图表视图,让您在程序编程后提供实时图表数据,但是你想看到的东西IB尽管如此,你可能有prepareForInterfaceBuilder
填入一些虚拟的数据,例如。但你不应该重复你已经在init
方法做了配置。init
方法),但对于它的价值,如果我需要init
期间做配置,我一般写两个init
方法:
override init(frame: CGRect = .zero) {
super.init(frame: frame)
<#call configure routine here#>
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
<#call configure routine here#>
}
请注意,在init(frame:)
我公司还供应.zero
的默认值。这就确保了,我浑身上下都三种情况:
CustomView()
CustomView(frame:)
;要么
如果故事板电话CustomView(decoder:)
。
总之,我得到的两个报价三大init
方法。大声笑。所有这一切是说,你可以大大简化这一点:
@IBDesignable public class CustomParallelogramView: UIView {
@IBInspectable public var offset: CGFloat = 10 { didSet { updateMask() } }
override public func layoutSubviews() {
super.layoutSubviews()
updateMask()
}
private func updateMask() {
let path = UIBezierPath()
path.move(to: CGPoint(x: bounds.minX + offset, y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.maxX - offset, y: bounds.maxY))
path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))
path.close()
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
layer.mask = shapeLayer
}
}
尝试:
@IBInspectable var offset: Float = 10.0 {
didSet {
drawParallelogram()
}
}