gpt4 book ai didi

swift - 二次曲线在不同设备上无法正确呈现

转载 作者:行者123 更新时间:2023-11-28 05:40:26 25 4
gpt4 key购买 nike

我正在尝试绘制中间有二次曲线的贝塞尔曲线路径。该曲线在 iPhone 8 和 XS 上运行良好,但在其他设备上没有响应(即未正确呈现)。

下图为 iPhone XS 曲线图(正确)

enter image description here

和 iPhone XR(不正确)

enter image description here

我已经尝试使用 View 的约束来获取线的中间值,但不知何故它仍然不起作用

这是我绘制路径的代码:

//self.viewTabBorder is the grey line, which is a uiview with 1 pixel height
override func viewWillAppear(_ animated: Bool) {
let path = UIBezierPath()
path.move(to: CGPoint(x: self.viewTabBorder.center.x - self.btnHome.frame.width + 20, y: 0))
path.addQuadCurve(to: CGPoint(x: self.viewTabBorder.center.x + self.btnHome.frame.size.width - 20, y: 0), controlPoint: CGPoint(x: self.viewTabBorder.center.x, y: self.btnHome.frame.height + 5))
path.addLine(to: CGPoint(x: self.viewTabBorder.center.x + self.btnHome.frame.size.width - 20, y: 0))

let line = CAShapeLayer()
line.path = path.cgPath
line.strokeColor = UIColor(red: 224, green: 224, blue: 224).cgColor
line.fillColor = UIColor.white.cgColor
self.view.layer.addSublayer(line)
self.viewTabBorder.layer.addSublayer(line)
}

谁能告诉我我错过了什么?非常感谢您!

最佳答案

一些观察:

  1. 您正在定义子层到 View 的路径。在 viewWillAppear 中这样做还为时过早。布局引擎可能没有完成应用约束,将 View 放置在它们的最终位置。在 viewDidLayoutSubviews 中定义路径,不在 viewWillAppear 中(也不在 viewDidLoad 中,也不在 viewWillLayoutSubviews 中)。

    这还有一个优点,就是如果您更改应用以支持多个方向或进行任何影响 View 约束的更改,我们将再次调用此 viewDidLayoutSubviews,以便这些子层正确根据需要更新。如果您使用 viewWillAppear,您的应用将不支持动态更改您的 View (如果您需要的话)。

  2. 话虽如此,请注意 viewDidLayoutSubviews 可以被多次调用。因此,例如,您可以在 viewDidLoad 中添加子层,但在 viewDidLayoutSubviews 中更新它们的路径。

  3. 这可能不是问题,但我建议您在为子层定义路径时避免使用 framecenter。请记住,这两个属性是在它们的 superview 的坐标系中定义的。我建议您始终使用 View 的 bounds(在 View 自己的坐标系中定义),而不是它的 frame (在其父 View 的坐标系中定义)在尝试为子层定义路径时。例如,如果您想要在定义子图层路径时 View 的水平中心,请使用 bounds.midX 而不是 center.x

    有时这无关紧要(如果 View 在其父 View 中是边到边的),但是(a)它表明对不同坐标系的误解; (b) 如果您曾经添加安全区域或以其他方式调整 View 的位置,使用 frame/center 会给您带来麻烦。


一个稍微高级一点的概念:一旦你解决了眼前的问题,你可能会考虑将 subview 的这种配置移动到 UIView 子类中(使用它的 layoutSubviews 方法) ,甚至可能使它成为一个 @IBDesignable 类,这样您就可以在 Interface Builder 中看到它的呈现。或者,另一种方法是将其包装在容器 View Controller 中。但无论哪种方式,这都有助于防止 View Controller “膨胀”。这可能有点超出了这个问题的范围,但在您继续前进时需要考虑一些事情。

关于swift - 二次曲线在不同设备上无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944715/

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