Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to calculate iOS 11 size in different orientation?

I calculate itemSize dependent on safe area for UICollectionView with horizontal scroll and custom layout.

image

But for iPhone X safe area has different size for different orientation. My question is how should I calculate safe area size for landscape orientation in viewWillTransition function? Or how is it possible to do without this calculation?

like image 928
bogmila Avatar asked Sep 19 '17 11:09

bogmila


1 Answers

EDIT

To get safe area size without creating any additional views, use this:

view.safeAreaLayoutGuide.layoutFrame.size

If you want to use viewWillTransition method you can use this:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    // Before rotation
    print(view.safeAreaLayoutGuide.layoutFrame.size)

    coordinator.animate(alongsideTransition: { (context) in
        // During rotation
    }) { (context) in
        // After rotation
        print(self.view.safeAreaLayoutGuide.layoutFrame.size)
    }
}

In the completion block you will get your desired size, note however, that this code will be called after the rotation.

Original answer

Solution using additional UIView:

What I did was to create a UIView and pin it with constant 0 to Safe Area Guides, so that it always matches size of Safe Area:

enter image description here

I created an @IBOutlet of that UIView and in viewDidLayoutSubviews() check the size:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    print(containerView.frame.size)
}

After rotation I also get the updated size of that UIView.

like image 68
jonaszmclaren Avatar answered Sep 20 '22 05:09

jonaszmclaren