UIBezierPath 未按预期更新
Posted
技术标签:
【中文标题】UIBezierPath 未按预期更新【英文标题】:UIBezierPath not updated as expected 【发布时间】:2015-11-22 14:35:49 【问题描述】:这是我的自定义视图代码:
class CircleView3: UIView
let endPoint = 270.0
var index = 0.0
var startPoint: Double
get
index++
let div = 360.0/60.0
let vaule = div * index
return 290.0 + vaule
func degreesToRadians (number: Double) -> CGFloat
return CGFloat(number) * CGFloat(M_PI) / 180.0
override func drawRect(rect: CGRect)
super.drawRect(rect)
let startAngleRadiant: CGFloat = degreesToRadians(startPoint)
let endAngleRadiant: CGFloat = degreesToRadians(endPoint)
print("start = \(startAngleRadiant)")
print("end = \(endAngleRadiant)")
let center = CGPoint(x: bounds.midX, y: bounds.midY)
let path = UIBezierPath()
path.moveToPoint(center)
path.addArcWithCenter(center, radius: self.frame.height/2.2, startAngle: startAngleRadiant, endAngle: endAngleRadiant, clockwise: true)
path.addLineToPoint(center)
let strokeColor: UIColor = UIColor(red: 155.0/255.0, green: 137.0/255.0, blue: 22.0/255.0, alpha: 1.0)
strokeColor.setFill() //strokeColor.setStroke()
path.fill()
path.stroke()
我正在画一个圆圈。我每秒从视图控制器调用setNeedsDisplay
函数。我应该画一个每秒减少起点和终点的圆圈,但即使在更新之后,圆圈也会保持其最后一行(位置)。加上圆圈没有填充我的颜色,只是填充了线条。
http://www.mediafire.com/watch/xnkew5eu8da5wub/IMG_0066.MOV
更新
我打印drawRect
中的起始值,值是正确的:
start = 293.6
start = 297.2
start = 300.8
start = 304.4
start = 308.0
start = 311.6
start = 315.2
start = 318.8
start = 322.4
start = 326.0
start = 329.6
start = 333.2
start = 336.8
start = 340.4
当然,这些是在将它们更改为弧度之前的值。
更新 2
我打电话给strokeColor.setFill()
后情况好多了,但我还是看到了问题。请观看这个新视频:
http://www.mediafire.com/watch/nb1b3v2zgqletwb/IMG_0069.MOV
【问题讨论】:
你需要在 path.fill() 之前说 strokeColor.setFill() 来填充它。您应该在调用 setNeedsDisplay 的位置发布计时函数的代码 @beyowulf 好的 set fill 解决了填充问题,但我仍然在我的主要问题中,为什么需要调用 setneed 显示的代码?该代码除了调用视图的 setneedsdisplay 之外什么都不做。 whick 将在 CircleView3 中调用我的 draw rect 函数 似乎路径被一遍又一遍地绘制在自身之上。你对视图层做了什么吗?或者在计时器函数中创建视图并将其添加到视图控制器的视图中? @beyowulf 不不我什么都不做,在colore上设置填充后,情况有所改善,我正在尝试上传新视频, 你看过@vacawama 的回答吗?我做了和他一样的事情,得到了同样的结果。你是在说 setNeedsDisplayInRect 之类的吗? 【参考方案1】:为了它的价值,我将你的代码放在一个项目中,我看到一个缩小的圆圈,因为在 customView 上调用了setNeedsDisplay
。它不像您的视频那样绘制。
这是我的附加代码:
class ViewController: UIViewController
@IBOutlet weak var circleView: CircleView3!
override func viewDidLoad()
super.viewDidLoad()
NSTimer.scheduledTimerWithTimeInterval(0.25, target: self, selector: "updateCircle", userInfo: nil, repeats: true)
func updateCircle()
circleView.setNeedsDisplay()
【讨论】:
那是我不明白的。和你一起工作吗?我在我的视图控制器中有这个 formatter.dateFormat = "mm:ss" let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true) timer.fire() 和函数更新是: circleTimerView.setNeedsDisplay() 其中 circleTimerView 是视图的出口。你理解我?我放了一个新视频 我正在使用您上面的确切CircleView3
代码和我的代码,如图所示,您的视图绘制正确。您的设置必须有其他不同之处。尝试仅使用我的代码和您的 CircleView3
创建一个新项目,您应该会看到它正常工作。
我正在尝试查看 prboem,首先我不知道为什么会出现这种黑色背景。其次,我真的没有在我的代码中做任何其他事情,我只是所有的集合都需要显示。
您使用的是什么版本的 Xcode?我在 Interface Builder 中设置自定义视图的背景颜色。黑色或白色,圆圈看起来不错。
我使用的是 7.1 (7B91b) 版本。我不知道该说什么,我仍然有问题,我希望有人帮助我或者你请帮助我以上是关于UIBezierPath 未按预期更新的主要内容,如果未能解决你的问题,请参考以下文章