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 未按预期更新的主要内容,如果未能解决你的问题,请参考以下文章

safeAreaInsets 未按预期更新

Vue 计算属性未按预期更新

PostgreSQL 更新未按预期工作

AccessDataSource 上的更新命令未按预期更新表

mycursor.executemany 更新未按预期工作

SQL 更新代码与“在哪里存在”未按预期运行