Swift3 创建上箭头

Swift3 创建上箭头,swift3,uibezierpath,uigraphicscontext,Swift3,Uibezierpath,Uigraphicscontext,我正在尝试显示所选页面菜单的箭头。但是,我画的箭头并没有像我预期的那样出现。它需要上升 这是我的密码: class ArrowView : UIView { required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(frame: CGRect) { super.init(frame: frame) self.

我正在尝试显示所选页面菜单的箭头。但是,我画的箭头并没有像我预期的那样出现。它需要上升

这是我的密码:

class ArrowView : UIView {

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.clear
}

var rect: CGRect!
var arrorBackgroundColor: UIColor?

var midX: CGFloat { return rect.midX }
var midY: CGFloat { return rect.midY }
var maxX: CGFloat { return rect.maxX }
var maxY: CGFloat { return rect.maxY }

override func draw(_ rect: CGRect) {
    self.rect = rect

    let ctx = UIGraphicsGetCurrentContext()

    ctx?.beginPath()
    ctx?.move(to: CGPoint(x: 0, y: 0))

//        Old code which the arrow was down
//        ctx?.addQuadCurve(to: CGPoint(x:maxX * 0.2 , y: maxY * 0.2), control: CGPoint(x: maxX * 0.12, y: 0))
//        ctx?.addLine(to: CGPoint(x: midX - maxX * 0.05, y: maxY * 0.9))
//        ctx?.addQuadCurve(to: CGPoint(x: midX + maxX * 0.05, y: maxY * 0.9), control: CGPoint(x: midX, y: maxY))
//        ctx?.addLine(to: CGPoint(x: maxX * 0.8, y: maxY * 0.2))
//        ctx?.addQuadCurve(to: CGPoint(x: maxX, y: 0), control: CGPoint(x: maxX * 0.88, y: 0))

    ctx?.addLine(to: CGPoint(x: midX - maxX * 106.5, y: maxY * 65.5))
    ctx?.addLine(to: CGPoint(x: maxX * 128.5, y: maxY * 88.5))
    ctx?.addLine(to: CGPoint(x: 85.5, y: 88.5))
    ctx?.closePath()

    ctx?.setFillColor((arrorBackgroundColor?.cgColor)!)
    ctx?.fillPath();
}

}
这是怎么回事

实际上,我正在尝试自定义此库:

并尝试像这样存档:


由于我是UIBezierPath的初学者,非常感谢您的帮助。

我不理解您对addLineto:的调用中的常量,我认为ArrowView的实现是不必要的怪异

您似乎对midX/maxX/感到困惑。。。或者我现在太笨了,弄不懂。这应该会有所帮助

我认为您链接到的github项目中的ArrowView的原始作者在设置箭头位置时以某种方式混淆了边界和帧。哦,他还滥用了draw_:中的rect参数,请参见。特别强调:

直肠 视图边界中需要更新的部分。这个 第一次绘制视图时,此矩形通常是整个视图 视图的可见边界。但是,在随后的绘图过程中 操作时,矩形可能只指定视图的一部分

此外,ACTabScrollView似乎只在某些时候起作用。在我的浅层实验中,它在大多数情况下扰乱了视图定位

无论如何,要为向上箭头实现一个简单的UIView,可以这样做:

class ArrowView : UIView {
    var arrorBackgroundColor: UIColor = UIColor.red

    override func draw(_ rect: CGRect) {
        guard let ctx = UIGraphicsGetCurrentContext() else { return }

        // Sample to really fill the background before drawing the arrow.    
        ctx.setFillColor(UIColor.yellow.cgColor)
        ctx.fill(bounds)

        ctx.beginPath()
        ctx.move(to: CGPoint(x: 0, y: bounds.maxY))
        ctx.addLine(to: CGPoint(x: bounds.midX, y: bounds.minY))
        ctx.addLine(to: CGPoint(x: bounds.maxX, y: bounds.maxY))
        ctx.addLine(to: CGPoint(x: 0, y: bounds.maxY))
        ctx.closePath()

        ctx.setFillColor(arrorBackgroundColor.cgColor)
        ctx.fillPath()
    }
}
核心是使用视图的边界来计算坐标

发件人:

视图的几何图形由其框架、边界和中心定义 财产。框架定义了中视图的原点和尺寸 其superview的坐标系,通常在 布局以调整视图的大小或位置。中心财产 可用于调整视图的位置,而无需更改其位置 大小边界定义了视图的内部尺寸 可以看到它们,并且几乎只在自定义图形代码中使用。这个 框架和边界矩形的大小部分耦合在一起 因此,更改任一矩形的大小都会更新 两者都有


我认为ArroBackgroundColor实际上应该被称为arrowColor,因为它被用作箭头的颜色,并且您可能有另一个ArroBackgroundColor属性,它实际上用于背景。我添加了两行以黄色填充背景作为示例。

谢谢您的详细解释。看起来当我测试它时,箭头位置方向上升。但是,视图仍在滚动菜单的下方。如果我们能在标签菜单中把视图向上移动会更好吗?你不这么认为吗?这就是我试图归档的内容:。因此,如果你能帮助我,这将是非常棒的。为此,你必须更改ACTabScrollView中定位箭头视图的代码。我搜索了arrowView.bounds.origin=并将边界替换为frame,然后从y中减去arrowView.bounds.height,使其显示为arrowView.frame.origin=CGPointx:self.bounds.width-arrowView.bounds.width/2,y:tabSectionHeight-arrowView.bounds.height.Oh,这有两种外观。一个在PrepareForenterFaceBuilder中,一个在setupPages中。在使用drawing rect时,您的建议首先填充颜色非常有用。谢谢你的提示。现在一切正常。我将努力为那个图书馆捐款。如果可以的话,我们也欢迎您的贡献。