所以我已经将UIView子类化并添加了一些绘图代码。我正在向上和向下缩放生成的视图。 我希望这个视图独立于分辨率,以便它在任何尺寸上都清晰可辨,并且我不需要管理多个图像等等。
作为测试,我编写了一些看起来像这样的绘图代码。 它创造了同心椭圆形,适合UIView所具有的任何框架尺寸。 实际上外圈略小于框架,因此它不会被夹住。很好。实际的图形将更复杂,并且将包含必须在小尺寸和具有这种性质的东西上可读的文本。
- (void)drawRect:(CGRect)rect
{
UIColor* color = [UIColor colorWithRed: 0.833 green: 0.833 blue: 0.833 alpha: 1];
float width = self.bounds.size.width;
float height = self.bounds.size.height;
float scalePercent = 0.8;
for(int i = 0; i < 10; i++){
width = width * scalePercent;
height = height * scalePercent;
float x = (self.bounds.size.width - width) / 2;
float y = (self.bounds.size.height - height) / 2;
UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(x, y, width, height)];
[color setStroke];
ovalPath.lineWidth = 2;
[ovalPath stroke];
}
}
现在进行缩放:
- (void) makeBig{
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:(void (^)(void)) ^{
self.transform = CGAffineTransformMakeScale(2, 2);
}
completion:^(BOOL finished){
}];
}
当你运行它时,视图会放大,但它会像素化。它是像素化的,因为视图的大小增加了一倍,但它的分辨率没有改变。
所以,在这里不怎么做。
- (void) makeBig{
[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:(void (^)(void)) ^{
self.transform = CGAffineTransformMakeScale(2, 2);
}
completion:^(BOOL finished){
CGRect targetFrame = self.frame;
self.transform = CGAffineTransformIdentity;
self.frame = targetFrame;
[self setNeedsDisplay];
}];
}
这样可以,但是当分辨率快速恢复到屏幕分辨率时,修复在动画结束时可见。 我可以尝试预先缩放视图并预先绘制最终大小,然后缩小它,然后运行动画再次将其缩放,但由于各种原因,我认为这听起来完全是愚蠢的。我想我可能是错的,这是自火灾以来最明智的想法。我有点怀疑它。
那么矢量内容的平滑规模如何最佳?
答案 0 :(得分:1)
基于视图的动画非常方便,但如果我没弄错,它会使用CABasicAnimation
,它只使用一个关键帧。这将是一个更多的代码,但如果您使用CAKeyframeAnimation
代替,Core Animation将重绘每个关键帧的动画层的内容(您可以指定何时出现),这样您就可以避免出现像素化。