Swift - 添加自定义 Curve 扩展后,它不会呈现以编程方式创建的视图,只会呈现使用 Interface Bui



我有一个扩展来弯曲视图的底部边缘,因为这种样式在我尝试创建的应用程序中的多个屏幕上使用。

但是,我注意到我只能使它适用于我已添加的视图 通过界面构建器.如果我尝试将其应用于以编程方式创建的视图,它们不会呈现。

我创建了一个简单的例子来说明这个问题。主情节提要包含两个 viewController,中间有一个彩色视图:一个使用界面生成器创建,另一个以编程方式创建。

在 StoryboardVC 中,带有曲线的视图可以正确呈现,没有任何问题。setBottomCurve() 方法用于创建曲线。

如果将此与将入口点设置为程序化 VC 进行比较,则运行应用时,可以看到纯白屏幕。注释掉此行以查看视图再次显示。

这是使用的扩展名:

extension UIView {
func setBottomCurve(curve: CGFloat = 40.0){
self.frame = self.bounds
let rect = self.bounds
let y:CGFloat = rect.size.height - curve
let curveTo:CGFloat = rect.size.height
let myBezier = UIBezierPath()
myBezier.move(to: CGPoint(x: 0, y: y))
myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
myBezier.addLine(to: CGPoint(x: rect.width, y: 0))
myBezier.addLine(to: CGPoint(x: 0, y: 0))
myBezier.close()
let maskForPath = CAShapeLayer()
maskForPath.path = myBezier.cgPath
layer.mask = maskForPath      
}
}

我希望程序化VC看起来与StoryboardVC相同(除了颜色的差异)

示例项目可在此处找到: https://github.com/belamatedotdotipa/CurveTest2

我建议创建一个子类而不是使用扩展,这是一种特定的行为。

在这种情况下,当您以编程方式添加视图时,您无法看到预期的结果,因为在 viewDidLoad 中您没有视图的框架,在此示例中您可以使用draw函数:

class BottomCurveView: UIView {
@IBInspectable var curve: CGFloat = 40.0 {
didSet {
setNeedsLayout()
}
}
override func draw(_ rect: CGRect) {
setBottomCurve()
}
private func setBottomCurve() {
let rect = bounds
let y: CGFloat = rect.size.height - curve
let curveTo: CGFloat = rect.size.height
let myBezier = UIBezierPath()
myBezier.move(to: CGPoint(x: 0, y: y))
myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
myBezier.addLine(to: CGPoint(x: rect.width, y: 0))
myBezier.addLine(to: CGPoint(x: 0, y: 0))
myBezier.close()
let maskForPath = CAShapeLayer()
maskForPath.path = myBezier.cgPath
layer.mask = maskForPath
}
}

最新更新