In iOS6, UIViewController's view position is wrong at app launch - ios

IEverything works fine before iOS 6. I have a UIViewController subclass in a UINavigationController as usual. Its view is shrinking down about 20 px as if there is another status bar up top. When I push and pop the view back. The view went back to its correct position. I found out it's because UIViewControllerWrapperView (got by using self.view.superview) frame got wrong somehow in iOS 6.
Doing NSLog in viewDidAppear
At app launch ...
self.view.frame: {{0, 0}, {768, 891}} // was {{0, 0}, {768, 911}} in iOS5.1
self.view.superview: <UIViewControllerWrapperView: 0x9dddb80; frame = (0 20; 768 891); autoresize = W+H; layer = <CALayer: 0x9dddc30>>
// was (0 0; 768 911); in iOS5.1
After push and pop view controller (correct value) ...
self.view.frame: {{0, 0}, {768, 911}}
self.view.superview: <UIViewControllerWrapperView: 0x9dddb80; frame = (0 0; 768 911); autoresize = W+H; layer = <CALayer: 0x9dddc30>>
It never happens before. How does this appear in iOS 6 ?

Here is my current dirty fix in viewDidAppear.
// fix wrong UIViewControllerWrapperView frame by moving up and extending it back
CGRect wvFrame = self.view.superview.frame;
if (wvFrame.origin.y > 0) {
wvFrame.size.height += wvFrame.origin.y;
wvFrame.origin.y = 0;
self.view.superview.frame = wvFrame;
}

There's a better fix than accepted. Try to set wantsFullScreenLayout to YES in viewDidLoad.
self.wantsFullScreenLayout = YES;

Related

Swift UICollectionViewLayout contentSize crash

Trying to adjust the content size of a collection view on 4" screens in iOS and I'm getting an error in the console about the width using collection view flow layout.
if DeviceType.IS_4_INCH {
collectionView.contentSize = CGSize(width: screenWidth - 50, height: collectionView.collectionViewLayout.collectionViewContentSize.height)
}
Error:
The relevant UICollectionViewFlowLayout instance is
<UICollectionViewFlowLayout: 0x7fbb9144dd20>, and it is attached to
<UICollectionView: 0x7fbb92885800; frame = (10 10; 270 750); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7fbb914d25e0>; layer = <CALayer: 0x7fbb9147f560>; contentOffset: {0, 0}; contentSize: {325, 750}> collection view layout:
<UICollectionViewFlowLayout: 0x7fbb9144dd20>.
I see the issue is relating to content size (325) when the frame is 270 but when I try to change it based on the screen width it crashes.
Thanks
Looks like one of your elements exceeds the size of your UICollectionView after you resize frame
Try invalidating the current layout before reloading your data:
self.collectionView.collectionViewLayout.invalidateLayout()

UIScrollView zooming on incorrect point

I have a UIScrollView with an image, and the image is in a container view. The view hierarchy looks like this:
UIScrollView
UIView
UIImageView
Panning works fine, but when I use the pinch gesture to zoom, the image changes size, but doesn't move relative to the origin, so the point centred underneath the two fingers moves as the gesture progresses. This makes it very difficult to zoom in on a particular point, since it's sliding away as you're zooming.
Description of the views involved:
<MyApp.MyView: 0x7ff6fd827e00; baseClass = UIScrollView; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x61800004a4d0>; layer = <CALayer: 0x618000023420>; contentOffset: {684, 487.5}; contentSize: {1731.4584832023011, 1154.3056554682007}>
<UIView: 0x7ff6fbe0c4d0; frame = (0 0; 1728 1152); transform = [2.2028669620902912, 0, 0, 2.2028669620902912, 0, 0]; layer = <CALayer: 0x6180000234c0>>
<UIImageView: 0x7ff6fbe09cd0; frame = (0 0; 1728 1152); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x618000023340>>
I have the UIImageView inside the UIView wrapper because I will have other views overlaid on the image which need to zoom/scale with the image.
There's very little of my own code running during the zoom. The UIScrollViewDelegate returns the UIView (the parent of the UIImageView), and configure the scroll view:
minimumZoomScale = 0.2
maximumZoomScale = 3.0
contentSize = image.size
Well, I've made a simple project that use your structure of views. And I didn't face with the problems. Possibly, you should check this things:are auto layout constraints setting right way is your parent view zooming correctly is mode of UIImageView fitting your needs Hope this may help

Can I use auto layout with UIPageViewController's pages?

I have the following controller stack:
- UINavigationController
- UITableViewController
- UIPageViewController
- MyTableViewController1
- MyTableViewController2
- MyTableViewController3
I am using AutoLayout and respecting the layout guides throughout the whole application.
However, MyTableViewController1|2|3 are instantiated inside the UIPageViewController DataSource methods and not through storyboard segues. I'm loading the viewControllers from storyboard using:
[self.storyboard instantiateViewControllerWithIdentifier:#"MyTableViewController1|2|3"];
MyTableViewController1|2|3.adjustScrollViewInsets = YES in storyboard.
But the adjustScrollViewInsets does nothing
In MyTableViewController1|2|3.viewDidLayoutSubViews I log the following:
self.view.frame = {{0, 0}, {320, 568}}
self.bottomLayoutGuide = <_UILayoutGuide: 0x1701b0bc0; frame = (0 531; 0 0); hidden = YES; layer = <CALayer: 0x17022fde0>>
self.topLayoutGuide = <_UILayoutGuide: 0x1781ae700; frame = (0 0; 0 64); hidden = YES; layer = <CALayer: 0x178220ca0>>
It seems I'm just missing some little detail here. Answers I found on stack-overflow are all for autolayout = NO situations.
The problem is MyTableViewController1|2|3's cells render behind the navigationBar.
Any help is much appreciated
Thanks

Hierarchy is different in storyboard and when debugged while app is running

I have used auto-layout and scrollview. I have created hierarchy in storyboard which looks as shown below :
Basically view has scrollview inside it and scrollview has another subview view1 inside it. Rest of the views are under view1.
While debugging one issue I am facing I show that self.scrollView.subviews prints 3 views. Out of them 2 are ImageViews. And those are not subview of scrollview as per the hierarchy in storyboard.
(lldb) po self.scrollView.subviews
<__NSArrayM 0xb66fe80>(
<UIView: 0xb74b110; frame = (0 0; 320 3240); autoresize = RM+BM; layer = <CALayer: 0xb74b170>>,
<UIImageView: 0xb7e61c0; frame = (313 476; 7 3); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0xb7e62a0>>,
<UIImageView: 0xb7e6350; frame = (314.5 3091.5; 3.5 36); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0xb7e6430>>
)
What can be wrong here? Ask for any detail you need.
The UIView on your console is this view
the 2 UIImageView's are the scroll indicators
And one cool thing to debug view hierarchy is recursiveDescription.
po [self.view recursiveDescription]

Frame shifted incorrectly with Autoresizing in iOS7

I'm having an issue with a view using autosizing resizing improperly in iOS7 (but fine in 6). The view initially renders as I'd expect, then I push another view onto the stack. Once I pop back to the original view, a subview that should be anchored on the right sizes itself too large and of the bounds of the superview.
It's a fairly simple view, created in a Storyboard, that includes the following hierarchy:
Scrollview -> View ->ImageView
It uses autosizing masks, which frankly was done because I had issues using autolayout inside the scrollview in this case (don't want to get into that here). The mask for the ImageView is pretty simple:
-
|
_
|-|<->|-|
-
|
-
On initial load, the X coord and width are as follows:
UIScrollView: frame = (0 64; 320 455); clipsToBounds = YES; autoresize
= W+H;
UIView: frame = (0 0; 320 568); autoresize = W+BM
UIImageView: frame = (20 110; 280 50); clipsToBounds = YES; opaque =
NO; autoresize = W;
On subsequent load, it appears as follows
UIScrollView: frame = (0 64; 320 455); clipsToBounds = YES; autoresize
= W+H
UIView: frame = (0 0; 320 568); autoresize = W+BM
UIImageView: frame = (20 160; 320 50); clipsToBounds = YES; opaque
= NO; autoresize = W
The notable difference being, as bolded, the width of the ImageView frame increases to 320, which is the size of it's bounds. Since it is still offset by 20, it ends up running off the screen. Obviously, I would expect it to stay at 280, as it does when this same thing is run in iOS6.
I don't manipulate the view in any way in code, so this should all be tied the autolayout masks. I cannot find anything about others having similar issues.
--

Resources