假设您有UIView
或CALayer
执行自己的(矢量)绘图,并且您希望它在任何尺寸下保持清晰,即使在缩放视图或图层时也是如此。如何使用transform
属性进行缩放时如何重绘?是强制进行bounds
更改而不是使用transform
的唯一方法吗?或者在每一步都致电setNeedsDisplay
?
为什么UIImageView
的行为似乎有所不同(即它似乎总是适当地缩放其源图像,即使它与transform
缩放且bounds
没有变化)?是因为它是唯一直接设置基础content
的{{1}}属性的情况吗?
答案 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