2017-03-11 3 views
1

Ich entwickle eine App, um einen Binärbaum anzuzeigen.UIView Orientierungsänderung in Swift

Jeder Knoten wird als eine Unteransicht angezeigt, die programmatisch vom ViewController generiert wird - ich führe Folgendes aus viewDidLayoutSubviews() aus.

let theView = BinaryTreeView(frame: CGRect(x: 0, y: 50, width: width, height: 100)) 
    // let theView = BinaryTreeView(s: "I'm testing") 
    theView.backgroundColor = .white 
    theView.addGestureRecognizer(UIPinchGestureRecognizer(target:theView, action:#selector(BinaryTreeView.changeScale(recognizer:)))) 
    self.view.addSubview(theView) 
    theView.eyesOpen = false 


    let secondView = BinaryTreeView(frame: CGRect(x: width/2, y: 150, width: width/2, height: 100)) 
    // let theView = BinaryTreeView(s: "I'm testing") 
    secondView.backgroundColor = .white 
    secondView.addGestureRecognizer(UIPinchGestureRecognizer(target:secondView, action:#selector(BinaryTreeView.changeScale(recognizer:)))) 
    self.view.addSubview(secondView) 


    let thirdView = BinaryTreeView(frame: CGRect(x: (width/2)+width/4, y: 250, width: width/4, height: 100)) 
    // let theView = BinaryTreeView(s: "I'm testing") 
    thirdView.backgroundColor = .white 
    thirdView.addGestureRecognizer(UIPinchGestureRecognizer(target:thirdView, action:#selector(BinaryTreeView.changeScale(recognizer:)))) 
    self.view.addSubview(thirdView) 

Das Problem ist, dass die Ansichten über Orientierungsänderung sich wiederholen (über drei Knoten sind, auf Orientierungsänderung 4 könnte angezeigt werden

ich durch Stapel sah und in meiner Unterklasse UIView ich hinzugefügt:.

.
self.contentMode = UIViewContentMode.redraw 

im programatic Subview aber das gleiche passiert

keine Sorge - ich werde meinen Knoten in einer Schleife später erzeugen (ich bin versuchen zu verstehen, wie Layout funktioniert). Übrigens habe ich festgestellt, dass das Gleiche passiert ist, indem ich eine UICollectionView verwendet habe, also schein ich etwas fundamental falsch zu machen.

Antwort

1

Ändern Sie das "Ziel:" für alle drei auf die Steuerung (auf self). Ihr Controller reagiert auf Gesten, nicht auf die Ansichten selbst. Das Ziel wird in allen drei Fällen gleich sein.

secondView.addGestureRecognizer(UIPinchGestureRecognizer(target:secondView, action:#selector(BinaryTreeView.changeScale))) 
    self.view.addSubview(secondView) 

wird

secondView.addGestureRecognizer(UIPinchGestureRecognizer(target:self, action:#selector(BinaryTreeView.changeScale))) 
    self.view.addSubview(secondView) 
+0

Danke - aber die Gesten arbeiten gut. Die Frage betrifft Orientierungsänderungen und Objekte, die nicht ordnungsgemäß regeneriert werden. – stevenpcurtis

+0

Sie haben gesagt, dass Sie bei der Orientierungsänderung zusätzliche Objekte erhalten. Das liegt daran, dass Sie Ihre Erkenner gekettet haben, indem Sie Ihre Ziele verkettet haben. Hast du versucht, das Ziel für alle 3 selbst zu ersetzen? Hat sich das Verhalten geändert? – Mozahler

+0

Wenn ich die Änderung an sich selbst mache und dann auf ein Objekt klicke, bekomme ich einen Absturz. Unbekannter Selektor an Instanz gesendet. – stevenpcurtis