簡體   English   中英

我怎么能欺騙[CALayer renderInContext:]只渲染圖層的一部分?

[英]How could I trick [CALayer renderInContext: ] to render only a section of the layer?

我很清楚除了渲染整個視圖和裁剪之外,沒有很好的方法將UIView的一小部分渲染到圖像中。 (像iPad 3這樣的產品非常昂貴,產生的圖像很大)。 有關renderInContext方法的說明,請參見此處 (沒有替代方法)。

我想要呈現的視圖部分無法預先確定,這意味着我無法將小部分的視圖層次結構設置為它自己的UIView(因此也就是CALayer)。

我的點子...

我有一個想法,但如果我要成功,我需要一些方向。 如果我在UIView(或CALayer)上創建一個類別,該方法添加了以下方法:

[UIView renderSubframe:(CGFrame)frame];

怎么樣? 好吧,我想如果創建子幀大小的虛擬視圖,那么視圖可以暫時移動到此。 然后虛擬視圖的層可以調用renderInContext:,從而獲得一種有效且快速的獲取視圖的方法。

所以...

我真的沒有達到CALayer / Quartz核心的速度......這有沒有機會工作? 如果沒有,我可以通過另一種方式實現同​​樣的目標 - 我能夠實現相同結果的最有效方式是什么(或者其他人已經遇到過這個問題並提出了不同的解決方案)?

這是我最后寫的類別。 由於方便的CGAffineTransform,沒有我想象的那么難。

#import "UIView+RenderSubframe.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (RenderSubframe)

- (UIImage *) renderWithBounds:(CGRect)frame {

    CGSize imageSize = frame.size;

    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
    CGContextRef c = UIGraphicsGetCurrentContext();

    CGContextConcatCTM(c, CGAffineTransformMakeTranslation(-frame.origin.x, -frame.origin.y));
    [self.layer renderInContext:c];

    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return screenshot;

}

@end

您可以通過以下幾種方式執行此操作:

  1. 在調用renderInContext之前為您的上下文指定CGContextClipToRect ;

  2. 采用:

setNeedsDisplayInRect:

將指定矩形內的區域標記為需要更新。

  - (void)setNeedsDisplayInRect:(CGRect)theRect 

這將使渲染僅在指定的rect中發生。 我不確定這是否會按照您的要求運作。

我認為第一個選項應該無縫地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM