21

I've noticed running this would cause view (or main window, not sure) to resize for a moment, when running on iPhone 6/6+ simulator scaled from iPhone 5 layout (without passing launch image for iPhone 6/6+):

[self.view snapshotViewAfterScreenUpdates:YES];

Any idea how to make it work when you can't pass 'NO' there?

Update (Jul 13th):
Does not seem to reproduce on iOS 8.4 anymore.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Dannie P
  • 4,464
  • 3
  • 29
  • 48

3 Answers3

13

Since it seemed like an Apple/API problem, I just decided to not use that method when I need to pass a "YES."

You can just take a screenshot (UIImage) of your view and place it in a UIImageView to act as the "UIView" you used to get from the snapshot method.

Here's a link for code: How to capture UIView to UIImage without loss of quality on retina display

#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}
Community
  • 1
  • 1
kgaidis
  • 14,259
  • 4
  • 79
  • 93
  • Unfortunately this does not work. It does the same as passing "NO" as a parameter to snapshotViewAfterScreenUpdates - which is not what @Dannie P is trying to do. – PJC Sep 25 '14 at 12:25
  • I disagree because passing a "NO" did not do the same thing as taking a snapshot using UIImage. Passing a "NO" gave me a blank view. There's no way to know whether it does the same thing without seeing the code. I do agree that it's not a complete replacement. I had to make some adjustments to my autolayout in IB to make less adjustment during the loading of the view because the UIImage snapshot takes it before constraints are properly adjusted. – kgaidis Sep 25 '14 at 17:52
  • I meant when you pass "NO", recent changes are not incorporated to the view, and it's the same when you just capture. Having the ability to integrate recent changes to the capture is sometimes very important, e.g. when you use this inside a custom transition (animateTransition...). – PJC Sep 28 '14 at 21:04
  • @anon screenhotting might be an answer in some cases. It would not help though if you e.g. try to do that in viewDidLoad to animate some transition – Dannie P Oct 01 '14 at 10:47
  • 2
    It solve my big problem . Great answer. I have upvote for your good post – Nischal Hada Aug 19 '15 at 07:17
3

I just had this issue.

The reason was that I didn't have launch images suitable for iPhone 6 nor 6 plus. Another issue I saw because of this non-existing image was that I got size for iPhone 5 when I asked the screen size bounds like this:

CGSize screenSize = [[UIScreen mainScreen] bounds].size;

When I fixed these images, this issue was fixed.

P.S - it should work whether you use asset catalog or nib file for the launch image. In the asset catalog you should add the 'V' in right side (Attributes Inspector) under iOS 8 and later, and set images for 'Retina HD 5.5' (for 6 plus) and 'Retina HD 4.7' (for iPhone 6)

Marcin Nabiałek
  • 109,655
  • 42
  • 258
  • 291
oren
  • 3,159
  • 18
  • 33
  • 1
    I don't see why this isn't the accepted answer. It works like a charm now! Thanks – DZenBot May 23 '15 at 08:39
  • DZenBot, the original goal was to make it work with iPhone 5th layout on iPhone 6 (scaled mode). The reason for that was a need to have a workaround before layout constraints has been fixed to support larger iPhones' sizes. – Dannie P Jul 13 '15 at 20:59
1

It seems like @anon and @PJC are right and that's a UIKit's bug. It sometimes can be workarounded by [view.layer renderInContext:UIGraphicsGetCurrentContext()]

At this point I've solved the problem for myself by manually adjusting layouts for iPhone 6/6+, as on native device resolutions the issue does not reproduce.

Dannie P
  • 4,464
  • 3
  • 29
  • 48