【问题标题】:adding bezierpath inside UIView Container在 UIView 容器中添加 bezierpath
【发布时间】:2017-01-05 01:14:57
【问题描述】:

我正在尝试在 UIView 容器内(底部)添加一个贝塞尔路径(三角形),但是我似乎无法正确理解 UIView 容器的要点。我得到了这个结果(容器视图左侧似乎显示了一条三角形):

我想要一个输出,例如:

这是我迄今为止的代码:

   // adding container to add image
        self.topContainer.backgroundColor = UIColor(red: 49/255, green:  207/255, blue: 203/255, alpha: 1)
        //        self.topContainer.backgroundColor = UIColor.white
        self.topContainer.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(self.topContainer)


        self.topContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        self.topContainer.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.55).isActive = true
        self.topContainer.widthAnchor.constraint(equalTo: view.widthAnchor).isActive =  true

        let bezierPath = UIBezierPath()                
        bezierPath.move(to: CGPoint(x: 0, y: self.topContainer.frame.size.height))
        bezierPath.addLine(to: CGPoint(x: self.topContainer.frame.size.width, y: 222))
        bezierPath.addLine(to: CGPoint(x: self.topContainer.frame.size.width, y: self.topContainer.frame.size.height))
        bezierPath.addLine(to: CGPoint(x: 0, y: self.topContainer.frame.size.height))

        UIColor.white.setFill()
        bezierPath.fill()
        bezierPath.lineWidth = 1
        bezierPath.close()

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = bezierPath.cgPath
        shapeLayer.lineWidth = 2.0
        shapeLayer.strokeColor = UIColor.white.cgColor
        shapeLayer.fillColor = UIColor.white.cgColor
        self.topContainer.layer.addSublayer(shapeLayer)

【问题讨论】:

  • ??在您的第一个屏幕截图中,我没有看到任何蓝色或红色。
  • 它应该是我实际 UIView 容器上绿色顶部的白色三角形,因为 setFill 应该是 UIColor.white.setFill()。即使我认为我的线路连接正确,它也没有显示? @马特
  • “它应该是绿色顶部的白色三角形”然后你在蓝色顶部显示一个红色三角形是很愚蠢的!
  • 它已更改,先生@matt
  • 是的,现在。我建议你在开始提问时应该非常小心。花时间理解并提供所需的信息。

标签: ios swift uiview uibezierpath


【解决方案1】:

您显然是在视图控制器的viewDidLoad 中执行此代码。你应该:

  • 删除 UIColor.white.setFill()path.fill() 代码。只有在图形上下文中绘制才有意义(例如,UIViewdraw 方法或 UIGraphicsBegin/EndImageContext 中的方法)。只需构建CAShapeLayer 并将其添加到视图/层层次结构中,操作系统就会为您处理绘制/填充它。

  • 继续在viewDidLoad 中创建和配置CAShapeLayer,但将UIBezierPath 的创建和CAShapeLayerpath 的设置移动到视图控制器的viewDidLayoutSubviews方法。视图的frameviewDidLoad 期间通常是未知的,并且肯定容易被更改(通过约束或自动调整掩码)。在调用viewDidLayoutSubviews 时,frame 已正确配置(如果主视图的frame 发生更改,将再次调用)。

【讨论】:

  • 但也许我们应该警告他使用一次性标志,否则他会一遍又一遍地添加路径,因为viewDidLayoutSubviews 可以被多次调用。
  • 这就是为什么我建议在viewDidLoad 中创建一次CAShapeLayer 并将其添加到层的层次结构中一次。然后viewDidLayoutSubviews 简单地将形状层的path 替换为新的UIBezierPath。它避免了这个问题。但是,是的,如果您每次都在viewDidLayoutSubviews 中添加一个新的CAShapeLayer,那么您可能会陷入痛苦的世界。
  • 嗨,@Rob 我完全按照你说的做了,但现在似乎根本没有创建路径或形状,尽管现在如上所述,我可以看到容器视图的高度和宽度。
  • @Aboogie - 没有看到你做了什么,我无法发表评论。但请看这个例子:github.com/robertmryan/PolygonViewDemo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多