在比例/变换上强制重绘UIView或CALayer

时间:2013-05-21 13:07:43

标签: ios uiview scale calayer drawrect

假设您有UIViewCALayer执行自己的(矢量)绘图,并且您希望它在任何尺寸下保持清晰,即使在缩放视图或图层时也是如此。如何使用transform属性进行缩放时如何重绘?是强制进行bounds更改而不是使用transform的唯一方法吗?或者在每一步都致电setNeedsDisplay

为什么UIImageView的行为似乎有所不同(即它似乎总是适当地缩放其源图像,即使它与transform缩放且bounds没有变化)?是因为它是唯一直接设置基础content的{​​{1}}属性的情况吗?

4 个答案:

答案 0 :(得分:5)

如果needsDisplayOnBoundsChange上的CALayer在您的情况下不够,您可以继承CALayer并实施+ (BOOL)needsDisplayForKey:(NSString *)key方法。示例:

+ (BOOL)needsDisplayForKey:(NSString *)key {
    if ([key isEqualToString:@"transform"]) {
        return YES;
    }
    return [super needsDisplayForKey:key];
}

现在每次transform属性更改时都应重绘您的图层。如果您的绘图很广泛,这可能会导致动画中出现性能问题。

答案 1 :(得分:1)

对于基于矢量的图层,您可以使用CAShapeLayer。这个specalised图层采用一条路径,并根据需要重绘,以保持图层清晰。

创建CGPathRef并将其分配给图层的path

shapeLayer.path = myPath;

答案 2 :(得分:0)

您可以手动处理自定义视图的setTransform方法。用于处理缩放事件的简化版本可能只是

-(void)setTransform:(CGAffineTransform)transform
{
    CGRect bounds = self.bounds;
    bounds.size.width *= transform.a;
    bounds.size.height *= transform.d;
    self.bounds = bounds;
}

这实际上只会调整视图大小(并导致重绘),而不是拉伸图像。

答案 3 :(得分:0)

您可以使用self.contentMode = UIViewContentMode.redraw