在UIView中平滑缩放矢量图形

时间:2013-04-20 03:40:34

标签: ios uiview core-graphics scale

所以我已经将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];
                     }];
}

这样可以,但是当分辨率快速恢复到屏幕分辨率时,修复在动画结束时可见。 我可以尝试预先缩放视图并预先绘制最终大小,然后缩小它,然后运行动画再次将其缩放,但由于各种原因,我认为这听起来完全是愚蠢的。我想我可能是错的,这是自火灾以来最明智的想法。我有点怀疑它。

那么矢量内容的平滑规模如何最佳?

1 个答案:

答案 0 :(得分:1)

基于视图的动画非常方便,但如果我没弄错,它会使用CABasicAnimation,它只使用一个关键帧。这将是一个更多的代码,但如果您使用CAKeyframeAnimation代替,Core Animation将重绘每个关键帧的动画层的内容(您可以指定何时出现),这样您就可以避免出现像素化。