iPad上的iPhone应用程序:drawViewHierarchyInRect导致故障

时间:2015-05-08 09:00:25

标签: ios objective-c iphone xcode ipad

在iPad(iOS 8)上运行iPhone应用程序,使用drawViewHierarchyInRect拍摄快照并在两个视图控制器之间执行自定义动画。它在iPhone上运行良好但是当应用程序在iPad上时(不是通用应用程序,仅限iPhone),您可以在动画开始时看到一个错误快照的简短一瞥。基本上它似乎拍摄了整个iPad屏幕的快照,包括黑色边缘,而不仅仅是模拟的iPhone屏幕。该应用程序还隐藏了状态栏,但您可以在简短的一瞥中看到状态栏,这意味着它可能是iOS中的某种错误,因为iPad总是在屏幕顶部显示iPhone应用程序的状态栏。

这是快照代码;

UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:update];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

顺便说一句,使用Airplay在Apple TV上显示应用程序时也会出现闪光灯。

2 个答案:

答案 0 :(得分:1)

用下面的代码替换你的代码,

std::getline(cin, lines[i]);

答案 1 :(得分:0)

事实证明,在这种情况下,似乎drawViewHierarchyInRect以某种方式简单地渲染到屏幕上......用CALayer的renderInContext替换它可以消除故障,但遗憾的是我的iPhone上性能较差所以我添加了一个检查来制作确保iPad模拟是唯一需要这样做的(幸运的是它在iPad上足够快)

UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
if( [self iPadRunningiPhoneSize] )
{
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
}
else
{
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:update];
}
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

该功能可以检查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到Apple TV时,故障是固定的,但当然对于模拟iPhone应用程序的iPad进行检查意味着使用Airplay的iPhone仍会在电视上出现故障,但这不是一个问题。非常关心这个应用程序!