많은 UIView 하위 뷰가 포함 된 UIScrollView 내에 UIView가 있습니다. 각 하위 뷰에는 CATiledLayer 레이어가 있습니다. 또한 컨텍스트 내에서 컨테이너 UIView (모든 하위 뷰 포함)를 그리는 돋보기 확대 기능이 있습니다. 관련 코드 :CATiledLayer 레이어를 사용하여 하위 뷰가 포함 된 UIView 드로잉을 최적화하는 방법
이는 확대경의 drawRect 방법입니다 :
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToMask(context , loupeRect, self.maskImage);
CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
CGContextFillRect(context, loupeRect);
CGContextSaveGState(context);
CGContextScaleCTM(context, gridScale, gridScale);
CGContextTranslateCTM(context, offset.x, offset.y);
CGRect rectToDraw = CGRectMake(-offset.x, -offset.y, 512, 512);
[appDelegate.gridViewController.objectContainerView drawInContext:context forRect:rectToDraw];
CGContextRestoreGState(context);
[overlayImage drawAtPoint:CGPointZero];
}
그리고 이것은 drawInContext입니다 : 파단이 그려 컨테이너에 UIView의 forRect 방법 :
- (void)drawInContext:(CGContextRef)ctx forRect:(CGRect)rect {
CGRect newrect = CGRectMake(rect.origin.x-1024, rect.origin.y-1024, 2048, 2048);
for (UIView* v in [self subviews]) {
float viewscale = v.transform.a;
if (CGRectIntersectsRect(newrect,v.frame)) {
CGContextSaveGState(ctx);
CGContextScaleCTM(ctx, viewscale, viewscale);
CGContextTranslateCTM(ctx, v.frame.origin.x/viewscale, v.frame.origin.y/viewscale);
[v drawLayer:v.layer inContext:ctx];
CGContextRestoreGState(ctx);
}
}
[super drawLayer:self.layer inContext:ctx];
}
그리고 마지막으로 이것은 CATiledLayer가있는 서브 뷰의 drawRect 메소드입니다.
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat scale = CGContextGetCTM(context).a;
scale = (scale <= .125) ? .125 : (scale <= .250 ? .250 : (scale <= .5 ? .5 : 1));
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];
CGSize tileSize = tiledLayer.tileSize;
tileSize.width /= scale;
tileSize.height /= scale;
int firstCol = floorf(CGRectGetMinX(rect)/tileSize.width);
int lastCol = floorf((CGRectGetMaxX(rect)-1)/tileSize.width);
int firstRow = floorf(CGRectGetMinY(rect)/tileSize.height);
int lastRow = floorf((CGRectGetMaxY(rect)-1)/tileSize.height);
for (int row = firstRow; row <= lastRow; row++) {
for (int col = firstCol; col <= lastCol; col++) {
UIImage *tile = [self tileForScale:scale row:row col:col];
CGRect tileRect = CGRectMake(tileSize.width * col, tileSize.height * row,
tileSize.width, tileSize.height);
tileRect = CGRectIntersection(self.bounds, tileRect);
[tile drawInRect:tileRect];
}
}
}
N 아, 모든 것이 내가 의도 한대로 작동하지만 앱이 확대 루페가 켜져 움직일 때 상당히 느려집니다. 문제는 loupe보기가 이동 될 때마다 drawRect 메서드가 호출되므로 (확대 된 내용을 업데이트 할 수 있음) 컨테이너 UIView의 drawInContext 메서드 등을 호출하여 모든 CATiledLayers가 이미지를 업데이트하도록하는 것입니다. 루페가 움직일 때마다 타일.
위에서 볼 수 있듯이, 나는 루페의 컨텍스트 내에서 컨테이너 뷰의 더 큰 부분을 그렸지만, 이것이 내가 붙어있는 부분이다. 이 컨테이너보기의 더 큰 부분을 어떻게 "버퍼링"할 수 있는지를 알 수 없으므로 루페가 이동하면 다시 그려지는 rect가 "버퍼 된"rect를 넘어선 경우에만 서브 뷰가 다시 그려집니다.
죄송합니다. 코드가 엉성한/newby 인 경우 - 나는 중간에 있는데 도움이 필요합니다.
감사합니다.
나는 @canfan과 같은 문제에 직면 해있다. 어떻게이 일을 끝내셨습니까? –