UIView中矢量图形的平滑缩放

Posted

技术标签:

【中文标题】UIView中矢量图形的平滑缩放【英文标题】:Smooth scaling of vector graphics in UIView 【发布时间】:2013-04-20 03:40:33 【问题描述】:

所以我继承了 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】:

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

【讨论】:

我猜我错过了什么。我需要调查一下。谢谢你。 另外,我在事后发现了另一个问题,但我希望用一些实际的代码来报告。 ***.com/questions/2168419/…

以上是关于UIView中矢量图形的平滑缩放的主要内容,如果未能解决你的问题,请参考以下文章

SVG(可缩放矢量图形)

UIButton 比例矢量图形

矢量图形(高效绘图 13.2)

矢量化的HTML5拓扑图形组件设计

在 python 中创建矢量图形以用于 word/powerpoint 的最佳方法

SVG