Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iPad上的iPhone应用程序:drawViewHierarchyInRect导致故障_Ios_Objective C_Iphone_Xcode_Ipad - Fatal编程技术网

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

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总是在屏幕顶部显示

在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显示应用程序时,也会出现闪烁。

结果表明,在这种情况下,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();