gpt4 book ai didi

ios - UIView 中矢量图形的平滑缩放

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:20 24 4
gpt4 key购买 nike

所以我继承了 UIView 并添加了一些绘图代码。我正在上下缩放生成的 View 。我希望此 View 独立于分辨率,以便在任何尺寸下都清晰可见,并且我不需要管理多个图像等。

作为测试,我编写了一些绘图代码,如下所示。它创建适合 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){
}];
}

当你运行它时, View 会放大,但它是像素化的。它是像素化的,因为 View 的大小增加了一倍,但分辨率没有改变。

所以,这是不这样做的方法。

- (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];
}];
}

这可行,但当分辨率快速回到屏幕分辨率时,修复在动画结束时可见。我可以尝试预先按比例放大 View 并以最终尺寸预先绘制,然后将其缩小,然后运行动画以再次按比例放大,但出于各种原因,我认为这听起来很愚蠢。我想我可能是错的,这是自火灾以来最聪明的想法。不过我有点怀疑。

那么如何最好地完成矢量内容的平滑缩放?

最佳答案

基于 View 的动画非常方便,但如果我没记错的话,它使用的是 CABasicAnimation,它只使用一个关键帧。代码会多一点,但是如果你使用 CAKeyframeAnimation 代替,Core Animation 会为每个关键帧重新绘制动画层的内容(你可以指定这些发生的时间),所以你可以避免像素化的出现。

关于ios - UIView 中矢量图形的平滑缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16116301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com