0

ズーム中に CALayer のようにスムーズに描画するにはどうすればよいですか?

3 番目 (最も高い) の画像に見られるように、白い境界線が正確なanti-aliasedレンダリングで描かれています。

ただし、ラベル( を設定してもcontentScaleFactor)も手描きの円(オンにしてもanti aliasing)はありません。

CALayer と同じくらいスムーズにズーム係数に合わせてスケーリングする UIKit コンポーネントまたは手描きのグラフィックスのアンチエイリアス レンダリングを行うにはどうすればよいですか?

魔法は何ですか?

小さな 中くらい 大きい

白い境界線は、ビューの CALayer を使用して描画されます。

    self.layer.cornerRadius = frame.size.width / 2.0f ;
    self.layer.borderColor = [UIColor whiteColor].CGColor ;
    self.layer.borderWidth = 3.0f ;

数字はUILabelのものです

    CGFloat contentScale = self.zoomScale * [UIScreen mainScreen].scale; // Handle retina
    label.contentScaleFactor = contentScale;

そして与えられた:

    typedef struct {
        CGRect      rect ;
        CGColorRef  color ;
    } EventColor ;

4 つの円は CoreGraphics を使用して描画されます

    ::CGContextSetAllowsAntialiasing(context, true) ;
    ::CGContextSetShouldAntialias(context, true) ;
    // ...
    EventColor ec = ...
    // ...
    ::CGContextSetFillColorWithColor(context, ec.color) ;
    ::CGContextFillEllipseInRect(context, ec.rect) ;
4

1 に答える 1

0

私が何を意図しているのかを誤解していたことが判明し、私がcontentScaleFactor本当に求めていたのは CALayer のものであることがわかりcontentScaleました。

結論としてdrawRect、ビューのレイヤーの contentScale がスクロール ビューの現在のズーム レベルを反映するように設定されている場合、どの UIView サブクラスのメソッドも先に進み、ズーム スケールが常に 1.0 に設定されているふりをすることができます。

- (void) scrollViewDidEndZooming: (UIScrollView *) scrollView
                        withView: (UIView *) view
                         atScale: (float) scale {

    scale *= [UIScreen mainScreen].scale ;
    for (UIView * v in view.subviews) {
        v.layer.contentsScale = scale ;
        [v setNeedsDisplay] ;
    }
}

上記の例では、スクロール ビューに非不透明なコンテナー ビューが含まれていることを前提としています。このコンテナー ビューには、layer.contentScale調整が必要なすべての実際のビューが含まれています。

于 2013-04-13T21:16:14.840 に答える