【问题标题】:ios 7 drawViewHierarchyInRect:afterScreenUpdates: black screen on iPad onlyios 7 drawViewHierarchyInRect:afterScreenUpdates:仅在 iPad 上出现黑屏
【发布时间】:2014-02-12 14:28:14
【问题描述】:

我遇到了非常奇怪的情况...我正在尝试通过调用 drawViewHierarchyInRect: afterScreenUpdates: 从滚动视图(contentSize 超出屏幕边界三倍)捕获内容,如下所示:

+ (UIImage *) imageFromScrollView: (UIScrollView *) scrollView {

    UIGraphicsBeginImageContext(size);

    [view drawViewHierarchyInRect: CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)
               afterScreenUpdates: YES];

    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();  

    return image;  
}

它适用于:iPhone 设备、iPhone 和 iPad 模拟器,但适用于 iPad 设备。你有过类似的问题吗?我将不胜感激!

【问题讨论】:

  • 你试过[view.layer renderInContext:UIGraphicsGetCurrentContext()];看看你是否得到任何不同的结果?此外,它不应该使图像完全变黑,但另一件事是你不应该真正使用 UIGraphicsBeginImageContext()。而是使用 UIGraphicsBeginImageContextWithOptions()。这样它就可以在视网膜/非视网膜设备上正确显示。
  • 我也试过UIGraphicsGetCurrentContext()UIGraphicsBeginImageContext()。之前我用renderInContext:你提到的方法,但是我想利用iOS 7的新方法,这似乎更快。

标签: ios iphone objective-c ipad ios7


【解决方案1】:

使用

UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);

NO 在这里很重要,因为它返回一个不透明的图像。

【讨论】:

    【解决方案2】:

    此代码对我有用。

    UIImage *image = [SnapShotter snapShotEntireScrollingView:self.receiptTableView];
    
    
    + (UIImage *)snapShotEntireScrollingView:(UIScrollView *)view
    {
        return [self snapShotEntireScrollingView:view withEdgeInsets:UIEdgeInsetsZero];
    }
    
    
    + (UIImage *)snapShotEntireScrollingView:(UIScrollView *)view withEdgeInsets:(UIEdgeInsets)insets
    {
        CGRect currentFrame = view.frame;
    
        CGRect fullFrame = view.frame;
        fullFrame.size.width = MAX(currentFrame.size.width, view.contentSize.width);
        fullFrame.size.height = MAX(currentFrame.size.height, view.contentSize.height);
        view.frame = fullFrame;
    
        UIImage *image = [self snapShotView:view withEdgeInsets:insets];
    
        view.frame = currentFrame;
        return image;
    }
    

    【讨论】:

    • 您的解决方案非常简单,但它仍然无法在我的 iPad 设备上运行...最后,我决定使用 renderInContext: 方法捕获我的屏幕。我想为 iOS 7 使用新方法,但这是不可能的。感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多