stevenpcurtis
stevenpcurtis

Reputation: 2001

UIView Orientation change in Swift

I'm developing an app to display a binary tree.

Each node will be displayed as a subview programatically generated from the ViewController - I run the following from viewDidLayoutSubviews().

    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)

The issue is that on orientation change the views repeat each other (above there are three nodes, on orientation change 4 might display.

I looked through Stack and Within my subclassed UIView I added:

self.contentMode = UIViewContentMode.redraw

Within the programatic Subview but the same happens.

Don't worry - I'm going to generate my nodes in a loop later (I'm trying to understand how layout works). Incidentally I found the same happened using a UICollectionView so I seem to be doing something fundamentally wrong.

Upvotes: 1

Views: 223

Answers (1)

Mozahler
Mozahler

Reputation: 5303

Change the "target:" to the controller (to self) for all three. Your controller will respond to gestures, not the views themselves. The target will be the same in all three cases.

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

becomes

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

Upvotes: 1

Related Questions