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时,您的建议首先填充颜色非常有用。谢谢你的提示。现在一切正常。我将努力为那个图书馆捐款。如果可以的话,我们也欢迎您的贡献。