2014-09-27 6 views
15

Ich konvertierte ein Projekt von iOS7 zu iOS8, das benutzerdefinierte Übergänge verwendet und das Modal nach dem Laden afterScreenUpdates:YES zu erfassen und sah, dass der gesamte Bildschirm für eine Sekunde skalieren und skalieren zurück nach unten. Ich sehe das auch in der Flickr-App für iOS zwischen den Abschnitten und in der Yelp-App beim Übergang zu einem Foto auf iOS8.iOS8 Skalierung glitch beim Aufruf von drawViewHierarchyInRect afterScreenUpdates: YES

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 22.0); 
    [self.view drawViewHierarchyInRect:self.view.frame afterScreenUpdates:YES]; 
    UIGraphicsEndImageContext(); 

einen größeren Skalierungsfaktor Hinzufügen hilft, den Glitch mehr zu betonen ... aber ich bin genau dies im Beispiel auf einem Tastendruck aufrufen.

EDIT Das auf dem iPhone passieren erscheint 6 und 6 Plus nicht auf dem 5.

scale glitch

Sample project github

+1

'[view.layer renderInContext: UIGraphicsGetCurrentContext()];' ist eine Workaround für jetzt aber würde es nicht die ios6 und ältere Weise tun – glued

+3

Es passiert auf fast allen Pre-iPhone 6 Geräte auf dem iPhone 6 und 6 Plus. Definitiv ein UIKit-Fehler bezüglich Bildschirmgröße/Auflösung/Grafikkontext/Skalierungsfaktor. –

+1

Ich sehe diesen Fehler nicht, wenn ich die Skalierung im Simulator deaktiviere (indem ich 6 und 6+ Startbilder zur Verfügung stelle).Sieht aus wie ein Fehler in der Art, wie iOS Apps auf den Bildschirm skaliert. –

Antwort

0

Erscheint 7 in iOS9/XCODE fixiert werden Builds

5

Sie zu bieten haben @ 3x Bilder für die 6 und 6 Plus starten . Die 6 wird bei 750 × 1334 skaliert, und das 6 + Bild wird bei 1242 × 2208 skaliert.

+0

Dies ist in der Tat beheben das Problem. – mbogh

-1

Ich fand eine Lösung für mich, um dieses Problem zu lösen.

Ich füge @ 3x Startbilder zu meinem Projekt hinzu. Und wählen Sie Start-Bildschirm-Datei auf "Main". Dies wird App in Originalauflösung ausführen, kleinere Grenzen, wenn auf iphone6 ​​ausgeführt, aber nicht beim Aufruf von DrawViewHierarchyInRect glitch. Like this.

Dann skalieren Sie meine Sicht auf Fullscreen wenn ViewDidLoad.

- (void)viewDidLoad{ 
     [super viewDidLoad]; 
     UIScreen *mainScreen = [UIScreen mainScreen]; 
     CGRect tempFrame=mainScreen.bounds; 
     double aspect=tempFrame.size.width/320; 
     self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, aspect, aspect); 
} 

Hoffnung hilfreich :)

13

Haben Sie es brauchen, nachdem die Bildschirm-Updates zu ziehen? weil ich verwende:

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 

und es scheint auf iOS7 und iOS8 gut zu funktionieren. Ich kann mir vorstellen, dass dies keine großartige Lösung für die regelmäßige Aufnahme von Bildern ist (wie mehrere Male pro Sekunde), aber es scheint für eine einmalige Unschärfe zu funktionieren.

1

Dieser Fehler tritt auch auf, wenn Sie auf einem iPad2 mit iOS7 ausgeführt werden.

Fix: Set afterScreenUpdates: zu NO

Meine app hat einige bewegen UIButtons, so dass ich nicht zulassen, dass die Unschärfe Übergang, bis die Bewegung zum Stillstand gekommen ist. Soweit ich bisher gefunden habe, gibt es keinen Unterschied in JA oder NEIN.

2

Auch sieht es aus wie Fehler in API können Sie drawViewHierarchyInRect mit afterScreenUpdates auf NO rufen Snapshot AFTER Bildschirm-Updates zu bauen, wenn Sie cunstruction wie folgt verwenden:

typedef void (^CompletionHandlerWithId)(id result); 

-(void)imageContaining:(CGRect)rect afterScreenUpdates:(bool)afterScreenUpdates opaque:(BOOL)opaque completion:(CompletionHandlerWithId)completion 
{ 
    bool success __block; 
    UIImage *snapshotImage __block = nil; 

    CompletionHandler block = ^{ 

     // Create the image 
     UIGraphicsBeginImageContextWithOptions(self.bounds.size, opaque, [[UIScreen mainScreen] scale]); 

     success = [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO]; 

     if (success) 
     { 
      snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 

      CGImageRef imageRef = CGImageCreateWithImageInRect(
            [snapshotImage CGImage], 
            CGRectMake(
              snapshotImage.scale*rect.origin.x, 
              snapshotImage.scale*rect.origin.y, 
              snapshotImage.scale*rect.size.width, 
              snapshotImage.scale*rect.size.height)); 

      // or use the UIImage wherever you like 
      snapshotImage = [UIImage imageWithCGImage:imageRef scale:snapshotImage.scale orientation:UIImageOrientationUp]; 

      CGImageRelease(imageRef); 
     } 

     UIGraphicsEndImageContext(); 

     if (completion) 
     { 
      if (! success) 
      { 
       NSLog(@"Error: [UIView drawViewHierarchyInRect] failed on %@", self); 

       (completion)(nil); 
      } 
      else 
      { 
       NSLog(@"Success: [UIView drawViewHierarchyInRect] on %@", self); 

       (completion)(snapshotImage); 
      } 
     } 
    }; 

    if (afterScreenUpdates) 

     [CATransaction setCompletionBlock:^{ 
      (block)(); 
     }]; 

    else 

     (block)(); 
}