Сбой шкалы iOS8 при вызове drawViewHierarchyInRect afterScreenUpdates: ДА

Я конвертировал проект из iOS7 в iOS8, который использует настраиваемые переходы и должен захватить модальный после завершения загрузки afterScreenUpdates:YES и видел, что весь экран масштабируется на секунду и уменьшает масштаб. Я также вижу, что это происходит в приложении Flickr для iOS между разделами и в приложении Yelp при переходе на фотографию на iOS8.

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

Добавление большего масштабного коэффициента помогает подчеркнуть сбой больше... но я просто вызываю это нажатием кнопки в примере.

EDIT. Это похоже на iPhone 6 и 6, а не на 5.

scale glitch

Пример проекта github

Ответы

Ответ 1

Появляется исправление в iOS9/XCODE 7 build

Ответ 2

Вам НУЖНО это сделать после обновления экрана? потому что я использую:

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

и, похоже, он отлично работает на iOS7 и iOS8. Я полагаю, что это не отличное решение для регулярного захвата изображений (например, несколько раз в секунду), но, похоже, оно работает для размытия.

Ответ 3

Вы должны предоставить изображения запуска @3x для 6 и 6 плюс. 6 масштабируется при 750x1334, а изображение 6 plus масштабируется при 1242x2208.

Ответ 4

Даже если он выглядит как ошибка в API, вы можете вызвать drawViewHierarchyInRect с afterScreenUpdates, установленным NO для создания моментальных снимков ПОСЛЕ обновления экрана, если вы используете cunstruction следующим образом:

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)();
}    

Ответ 5

Эта ошибка также существует, когда вы запускаете iPad2 под управлением iOS7.

Исправить: установить afterScreenUpdates: NO

В моем приложении есть несколько движущихся UIButtons, поэтому я не допускаю перехода blur до тех пор, пока движение не остановится. Насколько я нашел до сих пор, нет никакой разницы в ДА или НЕТ.

Ответ 6

Я нашел решение для решения этой проблемы.

Я добавляю @3x запуск изображений в свой проект. И выберите файл экрана запуска в "Основной". Это заставит приложение работать с оригинальным разрешением, меньшими границами при работе на iphone6, но не сбой при вызове drawViewHierarchyInRect. Нравится.

Затем масштабируйте мое представление в полноэкранном режиме, когда 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);
}

Надеюсь на помощь:)