2015-10-08 3 views
0

У меня есть UIView, который состоит из линий, фигур, текстовых и графических изображений. Этот UIView регулярно обновляется приложением путем повторного рисования всего изображения. Однако, когда я это делаю, текст, строки перемещаются в правильное новое место, а изображения дублируются. Очистка подзаголовков не работает. Кто-нибудь может объяснить, что я делаю неправильно? Пример прилагаемого кода показывает изображение, которое дублируется при каждом касании.core-graphic subviews not cleared

class myMap2: UIView { 

    var x_value: CGFloat = 100.0 
    var y_value: CGFloat = 100.0 
    var text_x = CGFloat(40.0) 
    var text_y = CGFloat(220.0) 

    override func drawRect(rect: CGRect) { 
     for view in self.subviews { 
      view.removeFromSuperview()   // does not execute 
      print ("removing a subview") 
     } 
     self.subviews.forEach({ $0.removeFromSuperview() }) // still not clearing subviews 
     let draw_context = UIGraphicsGetCurrentContext() 
     CGContextBeginPath(draw_context) 
     onDraw(draw_context!) 
     CGContextStrokePath(draw_context) 
     UIGraphicsEndImageContext() 
     let tapRecognizer = UITapGestureRecognizer(target:self, action:"didTap:") 
     self.addGestureRecognizer(tapRecognizer) 
    } 

    func onDraw(ctx: CGContextRef){ 

     let nRect = CGRectMake(text_x , text_y , 250.0, 25.0) 
     let font1 = UIFont(name: "Courier", size: 8.0) 
     let nAttr = [ 
      NSFontAttributeName: font1!, 
      NSForegroundColorAttributeName: UIColor.blackColor()] 
     let normalLine = "Normal text line. flag at x: \(x_value) y: \(y_value)" 
     normalLine.drawInRect(nRect, withAttributes:nAttr) 
     CGContextMoveToPoint(ctx, text_x + 20, text_y + 20) 
     CGContextAddLineToPoint(ctx, text_x + 40, text_y + 80) 
     CGContextAddLineToPoint(ctx, text_x + 175, text_y + 120) 
     let icon_layer = CALayer() 

     icon_layer.frame = CGRect(x: x_value, y: y_value, width: 40, height: 40) 
     let image = UIImage(named: "icon_red_flag")! 
     icon_layer.contents = image.CGImage 
     layer.addSublayer(icon_layer) 
    } 

    func didTap(gesture: UIGestureRecognizer) { 
     x_value = x_value + 10 
     y_value = y_value + 10 
     text_x = text_x + 10 
     text_y = text_y + 10 
     self.setNeedsDisplay() 
    } 
} 

![image after a few taps ]1

ответ

0

мне удалось решить этот вопрос путем сохранения каждого слоя в массиве, а затем удалить каждый элемент в массиве. Надеюсь, это поможет кому-то.

var layerArray = NSMutableArray() 

layer.addSublayer(icon_layer) 
layerArray.addObject(icon_layer) 

for layer in layerArray { 
    layer.removeFromSuperlayer() 
    layerArray.removeObject(layer) 
}