gpt4 book ai didi

Swift - 添加自定义曲线扩展后,它不会渲染以编程方式创建的 View ,仅渲染使用 Interface Builder 创建的 View

转载 作者:行者123 更新时间:2023-11-30 10:46:05 26 4
gpt4 key购买 nike

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

但是,我注意到我只能使其与通过界面生成器添加的 View 一起使用。如果我尝试将其应用到以编程方式创建的 View 上,它们不会呈现。

我创建了一个简单的例子来说明这个问题。主 Storyboard包含两个 View Controller ,中间有一个单一颜色的 View :一个是使用 Interface Builder 创建的,另一个是通过编程创建的。

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

如果将此与设置 ProgrammaticVC 的入口点进行比较,运行该应用程序,您可以看到纯白色的屏幕。注释掉该行以查看 View 再次出现。

这是使用的扩展:

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
}
}

我希望 ProgrammaticVC 看起来与 StoryboardVC 相同(除了颜色差异)

示例项目可以在这里找到: https://github.com/belamatedotdotipa/CurveTest2

最佳答案

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

在这种情况下,当您以编程方式添加 View 时,您看不到预期的结果,因为在 viewDidLoad 中您没有 View 的框架,在此示例中您可以使用 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
}
}

关于Swift - 添加自定义曲线扩展后,它不会渲染以编程方式创建的 View ,仅渲染使用 Interface Builder 创建的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55744897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com