4

假设您有一个UIView或 aCALayer进行自己的(矢量)绘图,并且您希望它在任何尺寸下都保持清晰,即使在缩放视图或图层时也是如此。当它与属性一起缩放时,我怎样才能让它重绘transform?是强制bounds更改而不是使用的唯一方法transform吗?还是setNeedsDisplay在每一步都打电话?

为什么UIImageView看起来表现不同(即它似乎总是适当地缩放其源图像,即使它被缩放transform并且bounds没有改变)?是因为它是唯一直接设置content底层资产属性的情况吗?CALayer

4

4 回答 4

7

如果needsDisplayOnBoundsChangeCALayer您的情况下还不够,您可以子类CALayer化并实现该+ (BOOL)needsDisplayForKey:(NSString *)key方法。例子:

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

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

于 2013-05-21T14:05:52.613 回答
1

对于基于矢量的图层,您可以使用CAShapeLayer。这个特殊的图层采用一条路径,并将根据需要重新绘制以保持图层看起来清晰。

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

shapeLayer.path = myPath;
于 2013-06-21T09:56:45.023 回答
0

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

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

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

于 2013-05-21T14:01:42.003 回答
0

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

于 2017-07-17T05:48:58.717 回答