2015-11-04 64 views
1

我有一個類下面,當附加到一個視圖繪製曲線時,用戶觸摸他們的設備。問題是繪製的線條似乎滯後於手指在屏幕上的位置。當線條的新部分與手指觸摸屏幕相距很小的距離時,滯後足以引起注意並且輕度惱人。繪製沒有滯後的曲線?

該代碼使用曲線方法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() 
} 
} 

回答

0

首先,我認爲你做錯了。如果你想畫出幾行不是用戶輸入的內容,而是用圓圈,扭曲的線條,簡單的東西,那麼這個用戶界面效果很好。

使用時:

self.setNeedsDisplay() 

您每次重繪所有的線路!這是艱難的CPU,這就是爲什麼你有滯後。圖像用戶繪製幾百行然後成千上萬,每次他/她觸摸屏幕,它將重繪所有這些行。

好的。所以,我推薦做的是有2個UIImageView:1)mainImageView - 它將保存整個圖形。 2)tempImageView - 用戶將用它來繪製。

的「tempImageView」當用戶觸摸/繪製它吸引,直到他們放手屏幕,然後合併「tempImageView」到「mainImageView」

這裏是一個教程:

http://www.raywenderlich.com/87899/make-simple-drawing-app-uikit-swift

+0

感謝您的回覆。我不認爲這是理由。在繪圖時進行更改時調用setNeedsDisplay是有效的。一個很好的解釋是:http://stackoverflow.com/a/10818417 其實您提到的示例教程是我最初開始使用的,但它在CPU上更加困難。它確實在它不應該觸及的事件中繪畫。實際上,示例教程中的方法,CPU最大並且應用程序在舊設備上崩潰。 上面代碼中的短暫滯後從第一次觸摸開始。試圖找出如何改善這種情況。 乾杯 – user4806509