そこで、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];
}];
}
これは機能しますが、解像度が画面の解像度に戻ると、アニメーションの最後に修正が表示されます。ビューを事前に拡大し、最終的なサイズで事前に描画してから縮小し、アニメーションを実行して再び拡大することもできますが、さまざまな理由から、それはまったくばかげているように思えます。私は間違っている可能性があると思いますが、それは火事以来の最も素晴らしいアイデアです. 半信半疑だけど。
では、ベクター コンテンツのスムーズなスケーリングはどのように行うのが最適なのでしょうか?