2016-05-14 3 views
1

Чтобы сэкономить время для любого пользователя в Google, я неправильно подумал, что clearsContextBeforeDrawing будет также очистить все слои, добавленные в drawRect. Это не.Чтобы очистить чертеж рисунка слоя drawRect

Конечно, как объяснил Мэтт, вы должны обязательно нарисовать обычный способ в drawRect, а затем clearsContextBeforeDrawing работает правильно. Пример,

override func drawRect(rect: CGRect) 
    { 
    // clearsContextBeforeDrawing works perfectly here as normal 
    // don't add any layers in here :) 

    let dotPath = UIBezierPath(ovalInRect:rect) 
    mainColor.setFill() 
    dotPath.fill() 
    let ins:CGFloat = (ringThickness/2) 
    let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,ins,ins)) 
    circlePath.lineWidth = ringThickness 
    ringColor.setStroke() 
    circlePath.stroke() 
    } 

Вот плохой способ привлечь drawRect

override func drawRect(rect: CGRect) 
    { 
    let circlePath = UIBezierPath(ovalInRect:rect) 
    let circle = CAShapeLayer() 
    circle.path = circlePath.CGPath 
    circle.fillColor = someColor.CGColor 
    layer.addSublayer(circle) 

    ... and a few more layers like ... 
    blah.fillColor = someColor.CGColor 
    layer.addSublayer(blah) 
    } 

Но как очистить перед нанесением?

Установка clearsContextBeforeDrawing ничего не делает.

Единственный способ, которым я могу очистить это путем удаления всех слоев:

override func drawRect(rect: CGRect) 
    { 
    // first remove all layers... 
    if let sublayers = layer.sublayers { 
     for layer in sublayers { 
      if layer.isKindOfClass(CAShapeLayer) //(essential) 
       { layer.removeFromSuperlayer() } 
     } 
    } 
    ... 
    } 

есть лучший способ, чтобы очистить «слой» рисунок?

ответ

3

Вот типичный способ привлечь в DrawRect

Нет, это не так. Это совершенно нетипично - и совершенно неправильно.

Единственное, что вы должны делать в drawRect, - это рисование в текущем контексте. Например:

let circlePath = UIBezierPath(ovalInRect:rect) 
circlePath.stroke() // draws into the current context 

Но ваш код о чем-то совершенно другое: вы создаете кучу дополнительных слоев. И это именно то, что с ним не так, и почему вы остаетесь царапать себе голову о том, как все выглядит так. Если вы делали правильную вещь в drawRect, вы бы обнаружили, что действительно, когда она вызывается, рисунок в представлении - очищен. Ваш рисунок на ваш взгляд не очищается, потому что у вас есть нет рисунок на ваш взгляд. Все в этих дополнительных слоях.

Итак, начните сначала. Научитесь правильно использовать drawRect. Либо рисуйте прямо в текущем контексте, либо поместите свой код управления уровнем в другом месте; но не объединяйте их, выполнив управление уровнем в drawRect.

+0

Это слишком открытый вопрос. У меня нет понятия, какова ваша общая цель. – matt

+0

В любом случае, я полностью понимаю это - потрясающе. Конечно, я должен был вникать в нынешний контекст. И тогда действительно 'clearsContextBeforeDrawing' действительно работает - yay! Поэтому я смутил то, что я думал, что «cleararsContextBeforeDrawing» также «очистит слои», если вы поймете, что я имею в виду. Ты поставил меня прямо :) Ницца ... – Fattie

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

  • Нет связанных вопросов^_^