3

そこで、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){
                     }];
}

これを実行すると、ビューが拡大されますが、ピクセル化されています。ビューのサイズが 2 倍になったためピクセル化されていますが、解像度は変更されていません。

だから、これをしない方法は次のとおりです。

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

これは機能しますが、解像度が画面の解像度に戻ると、アニメーションの最後に修正が表示されます。ビューを事前に拡大し、最終的なサイズで事前に描画してから縮小し、アニメーションを実行して再び拡大することもできますが、さまざまな理由から、それはまったくばかげているように思えます。私は間違っている可能性があると思いますが、それは火事以来の最も素晴らしいアイデアです. 半信半疑だけど。

では、ベクター コンテンツのスムーズなスケーリングはどのように行うのが最適なのでしょうか?

4

1 に答える 1

1

ビューベースのアニメーションは非常に便利ですが、私の間違いでなければCABasicAnimation、1 つのキーフレームしか使用しない を使用します。もう少しコードが長くなりますが、CAKeyframeAnimation代わりに を使用すると、Core Animation がキーフレームごとにアニメーション レイヤーのコンテンツを再描画するため (それらがいつ発生するかを指定できます)、ピクセル化の発生を回避できます。

于 2013-04-20T05:07:11.683 に答える