我有一個類下面,當附加到一個視圖繪製曲線時,用戶觸摸他們的設備。問題是繪製的線條似乎滯後於手指在屏幕上的位置。當線條的新部分與手指觸摸屏幕相距很小的距離時,滯後足以引起注意並且輕度惱人。繪製沒有滯後的曲線?
該代碼使用曲線方法addCurveToPoint
。 (替代addQuadCurveToPoint
曲線法似乎是在一個質量曲線而言較少優越,但確實顯示在屏幕上更快。)
我懷疑,這個問題涉及當setNeedsDisplay
被調用一次的counter == 4
到。代碼等待,直到繪製曲線之前的繪圖時收到4個新的接觸點。理想情況下,每個觸摸點繪製一條曲線(即計數器== 1),消除滯後。 (改變Counter == 1
似乎不工作)。
我迷路了,不知道如何更新代碼,以進一步提高其移除短暫的延遲,但保留的曲線。 在下面的代碼中需要改變以消除短時滯?
// Swift 2 code below tested using Xcode 7.0.1.
class drawView: UIView {
var path:UIBezierPath?
var incrementalImage:UIImage?
var points = [CGPoint?](count: 5, repeatedValue: nil)
var counter:Int?
var infoView:UIView = UIView()
var strokeColor:UIColor?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.multipleTouchEnabled = false
self.backgroundColor = UIColor.whiteColor()
path = UIBezierPath()
path?.lineWidth = 20.0
strokeColor = UIColor.darkGrayColor()
path?.lineCapStyle = CGLineCap.Round
}
override init(frame: CGRect) {
super.init(frame: frame)
self.multipleTouchEnabled = false
path = UIBezierPath()
path?.lineWidth = 20.0
}
override func drawRect(rect: CGRect) {
incrementalImage?.drawInRect(rect)
strokeColor?.setStroke()
path?.stroke()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
counter = 0
let touch: AnyObject? = touches.first
points[0] = touch!.locationInView(self)
infoView.removeFromSuperview()
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
let touch: AnyObject? = touches.first
let point = touch!.locationInView(self)
counter = counter! + 1
points[counter!] = point
if counter == 4{
points[3]! = CGPointMake((points[2]!.x + points[4]!.x)/2.0, (points[2]!.y + points[4]!.y)/2.0)
path?.moveToPoint(points[0]!)
path?.addCurveToPoint(points[3]!, controlPoint1: points[1]!, controlPoint2: points[2]!)
self.setNeedsDisplay()
points[0]! = points[3]!
points[1]! = points[4]!
counter = 1
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.drawBitmap()
self.setNeedsDisplay()
path?.removeAllPoints()
counter = 0
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
self.touchesEnded(touches!, withEvent: event)
}
func drawBitmap(){
UIGraphicsBeginImageContextWithOptions(self.bounds.size, true, 0.0)
strokeColor?.setStroke()
if((incrementalImage) == nil){
let rectPath:UIBezierPath = UIBezierPath(rect: self.bounds)
UIColor.whiteColor().setFill()
rectPath.fill()
}
incrementalImage?.drawAtPoint(CGPointZero)
path?.stroke()
incrementalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
}
}
感謝您的回覆。我不認爲這是理由。在繪圖時進行更改時調用setNeedsDisplay是有效的。一個很好的解釋是:http://stackoverflow.com/a/10818417 其實您提到的示例教程是我最初開始使用的,但它在CPU上更加困難。它確實在它不應該觸及的事件中繪畫。實際上,示例教程中的方法,CPU最大並且應用程序在舊設備上崩潰。 上面代碼中的短暫滯後從第一次觸摸開始。試圖找出如何改善這種情況。 乾杯 – user4806509