Ответ 1
Появляется исправление в iOS9/XCODE 7 build
Я конвертировал проект из 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.
Появляется исправление в iOS9/XCODE 7 build
Вам НУЖНО это сделать после обновления экрана? потому что я использую:
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
и, похоже, он отлично работает на iOS7 и iOS8. Я полагаю, что это не отличное решение для регулярного захвата изображений (например, несколько раз в секунду), но, похоже, оно работает для размытия.
Вы должны предоставить изображения запуска @3x для 6 и 6 плюс. 6 масштабируется при 750x1334, а изображение 6 plus масштабируется при 1242x2208.
Даже если он выглядит как ошибка в 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)();
}
Эта ошибка также существует, когда вы запускаете iPad2 под управлением iOS7.
Исправить: установить afterScreenUpdates: NO
В моем приложении есть несколько движущихся UIButtons, поэтому я не допускаю перехода blur до тех пор, пока движение не остановится. Насколько я нашел до сих пор, нет никакой разницы в ДА или НЕТ.
Я нашел решение для решения этой проблемы.
Я добавляю @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);
}
Надеюсь на помощь:)