
[code]

    import UIKit
    
    class ViewController: UIViewController {
     var onVLine: onVerticalLine!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        onVLine = onVerticalLine(frame: CGRectZero)
        self.view.addSubview(onVLine)
        }
    
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if(onVLine != nil){
        self.onVLine.removeFromSuperview()
        }
        }
    
    }
    
    
    
    class onVerticalLine: UIView {
    let _verticalLine: UIBezierPath = UIBezierPath()
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        print("onlineinited")
        _verticalLine.removeAllPoints()
        self.userInteractionEnabled = false;
        self.backgroundColor = UIColor(white:1,alpha:0)
        self.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.width)
        self.center = CGPointMake(UIScreen.mainScreen().bounds.width / 2, UIScreen.mainScreen().bounds.height / 2)
        print("vertical",self.frame)
        _verticalLine.lineWidth = 1
        _verticalLine.moveToPoint(CGPointMake(frame.origin.x,0))
        _verticalLine.addLineToPoint(CGPointMake(frame.origin.x, self.frame.origin.y + frame.height))
    
    
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    
    
    }
    
    
    override func drawRect(rect: CGRect) {
    
        print("onLinedrawRected")
        UIColor.blueColor().setStroke()
        _verticalLine.stroke()
    
        }
    }
    
[/code]

上記のようなプログラムを組んでいます。  
linesをViewControllerから消したいのですが、実行しても線が残ったままになってしまいます。

ちなみに、touchMovedにおいて

[code]

    self.view.addSubview(onVLines)
    self.onVLines.removeFromSuperView()
    
[/code]

とするとうまく消えてくれます。

実行自体はされているようですがどうも画面に反映されません。  
self.view.setNeedsDisplay()をしてみましたがそれも反応無しです。  
どうぞよろしくお願い致します。


CC BY-SA 3.0
2016-02-18T17:55:44.093
22249
2016-05-27T11:19:56.893
2016-02-20T14:06:53.730
13272
13272
question
swift
removeFromSuperviewがうまく機能しない


removeFromSuperViewが機能していないと書かれていますが、機能はしていると思います。  
touchesMovedはタッチ位置が変化したり、タッチの強さが変化するたびに呼び出されます。  
UIViewを継承したonVerticalLineビューを生成しては追加を繰り返していますので、親viewにはあっという間に数十個のビューが追加された状態になります。だから、画面上に見えているのは同じ見た目の数十個のビューのうちの一番上のものが見えているのです。

一般的には、touchesBeganでビューを生成追加、touchesMoveで生成したビューの位置を変更、  
touchesEndedとtouchesCancelledでビューを破棄、親viewから削除という流れになることが多いです。

touchesMoved内に、  
print(__FUNCTION__)などを書いてデバッグすれば、気がついたのではないでしょうか。


CC BY-SA 3.0
2016-02-21T04:23:52.053
22334
2016-02-21T04:23:52.053
8601
22249
answer