2015-09-24 4 views
1

У меня есть функция рисования линий, отредактированная ниже. Похоже, что в симуляторе все работает нормально, однако есть проблемы с производительностью, линии медленно рисуются, когда работают как на старом iPhone (2011), так и на более новом iPad (2014). Я считаю, что этот вопрос связан с созданием нового CGContext для каждого касаний Полученного события.Производительность чертежа с помощью Swift в Xcode для приложения iOS

Как можно, например, назвать пусть контекст = UIGraphicsGetCurrentContext() раз, когда touchesBegan? (т. е. как я могу сделать контекст общедоступной переменной, которую можно вызывать один раз?)

Любые другие советы по улучшению производительности будут оценены. Спасибо.

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 

    autoreleasepool { 

    UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0.0) 

    let context = UIGraphicsGetCurrentContext() 

    ... 
    ... 
    ... 

    UIGraphicsEndImageContext() 

    } 

} 
+0

Не могли бы вы просто создать контекст переменной уровня? –

+0

Спасибо за комментарий. Не могли бы вы вкратце объяснить, что вы имеете в виду, создав «контекст» как «переменную уровня класса»? Спасибо. – user4806509

ответ

3

Не выполняйте код чертежа в касанияхМодели. Вы должны сохранить все, что вам нужно, чтобы обновить свой рисунок (возможно, коснитесь места), затем позвоните по номеру setNeedsDisplay. Это приведет к вызову drawRect:, который будет содержать весь ваш код чертежа. Вам не нужно создавать контекст, просто используйте UIGraphicsGetCurrentContext().

Вот примерный подкласс UIView, который рисует красный круг под последней точкой касания.

class DrawView: UIView { 

    let circleSize:CGFloat = 50.0 
    var lastTouchPoint:CGPoint? 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    lastTouchPoint = touches.first?.locationInView(self) 
    self.setNeedsDisplay() 
    } 

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    lastTouchPoint = touches.first?.locationInView(self) 
    self.setNeedsDisplay() 
    } 

    override func drawRect(rect: CGRect) { 
    if let touchPoint = lastTouchPoint { 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetRGBFillColor (context, 1, 0, 0, 1); 
     CGContextFillEllipseInRect(context, CGRectMake(touchPoint.x - circleSize/2.0, touchPoint.y - circleSize/2.0, circleSize , circleSize)) 
    } 
    } 
} 
+2

Я бы поставил его сильнее. ** НЕ ПЫТАЙТЕСЬ ТРАТЬСЯ в прикосновениях **. Единственный раз, когда вы должны рисовать, - это drawRect, если только вы не создаете внеэкранный контекст для рендеринга изображения. Кроме этого, вы должны настроить и вызвать setNeedsDisplay. Это вызывает вызов метода drawRect. Когда drawRect называется графическим контекстом, настраивается соответствующим образом, и вы просто рисуете текущий контекст. –

+0

Спасибо. Итак, чтобы уточнить, что-то вроде следующего? переопределение функ touchesMoved (прикасается: NSSet, withEvent событие: UIEvent) { setNeedsDisplay() } переопределение функ DrawRect (Rect: CGRect) {// рисунок код здесь идет } На стороне записки, когда корректируя масштабный коэффициент для beginimagecontext, на производительность влияет. Когда масштаб равен 1,0, все работает очень быстро, однако масштабный коэффициент составляет 0,0, 2,0 или 3,0 для дисплеев сетчатки, производительность страшна при большом запаздывании при рисовании. ** UIGraphicsBeginImageContextWithOptions (self.view.frame.size, false, 0.0) ** – user4806509

+0

Я добавил пример. Так же, как вы не должны для каждого вызова touchsMoved, не создавайте новый контекст для каждого вызова drawRect. – Keller

Смежные вопросы