Ios iPad上的iPhone应用程序:drawViewHierarchyInRect导致故障
在iPad(iOS 8)上运行iPhone应用程序,使用drawViewHierarchyInRect拍摄快照并在两个视图控制器之间制作自定义动画。它在iPhone上运行良好,但当应用程序在iPad上(不是通用应用程序,仅限于iPhone)时,你可以在动画开始时看到一个不好的快照。基本上,它似乎拍摄了整个iPad屏幕的快照,包括黑色边缘,而不仅仅是模拟的iPhone屏幕。该应用程序还隐藏了状态栏,但你可以在简短的一瞥中看到状态栏,这意味着它可能是iOS中的某种缺陷,因为iPad总是在屏幕顶部显示iPhone应用程序的状态栏 这是快照代码Ios iPad上的iPhone应用程序:drawViewHierarchyInRect导致故障,ios,objective-c,iphone,xcode,ipad,Ios,Objective C,Iphone,Xcode,Ipad,在iPad(iOS 8)上运行iPhone应用程序,使用drawViewHierarchyInRect拍摄快照并在两个视图控制器之间制作自定义动画。它在iPhone上运行良好,但当应用程序在iPad上(不是通用应用程序,仅限于iPhone)时,你可以在动画开始时看到一个不好的快照。基本上,它似乎拍摄了整个iPad屏幕的快照,包括黑色边缘,而不仅仅是模拟的iPhone屏幕。该应用程序还隐藏了状态栏,但你可以在简短的一瞥中看到状态栏,这意味着它可能是iOS中的某种缺陷,因为iPad总是在屏幕顶部显示
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:update];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
顺便说一句,在苹果电视上使用Airplay显示应用程序时,也会出现闪烁。结果表明,在这种情况下,drawViewHierarchyInRect似乎以某种方式在屏幕上短暂呈现。。。用CALayer的RenderContext替换它可以消除这个问题,但不幸的是,它在我的iPhone上性能较差,所以我添加了一个检查,以确保iPad模拟是唯一需要这样做的(幸运的是,它在iPad上足够快) 该功能可以检查iPhone应用程序在iPad上被“模拟”的情况,以防该应用程序后来变得通用
- (BOOL)iPadRunningiPhoneSize
{
int name[] = {CTL_HW,HW_MACHINE};
size_t size = 100;
sysctl(name, 2, NULL, &size, NULL, 0); // getting size of answer
char *hw_machine = malloc(size);
sysctl(name, 2, hw_machine, &size, NULL, 0);
NSString *hardware = [NSString stringWithUTF8String:hw_machine];
free(hw_machine);
int greaterBound = MAX( [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height );
return [hardware rangeOfString: @"iPad"].location != NSNotFound && greaterBound == 480;
}
当使用iPad将Airplay播放到苹果电视时,故障已经修复,但当然,检查iPad是否模拟iPhone应用程序意味着使用Airplay的iPhone仍然会在电视上显示故障,但这并不是该应用程序的大问题 将代码替换为以下内容
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
是的,CMash。但我的意见是,只需将这些线添加到设备中即可。因为这对iPad和iPhone都适用。因此无需检查。layer renderInContext函数的性能差得多,因此会导致延迟,我读了一些同样的文章。这也向苹果公司报告。苹果只是提出了上述解决方案。
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();