13

UIViewのフレームを超えて伸びる円を描画したいUIViewがあり、masksToBoundsをNOに設定しました。これは、UIViewの境界の外側を左右に5ピクセル超えて描画できることを期待しています。

楕円はクリップされないことを期待していますが、クリップされて境界の外に描画されませんか?

- (void)drawRect:(CGRect)rect
{

    int width = self.bounds.size.width;
    int height = self.bounds.size.height;
    self.layer.masksToBounds = NO;

    //// Rounded Rectangle Drawing
    //// Oval Drawing
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, width+5, height+5)];
    [[UIColor magentaColor] setFill];
    [ovalPath fill];
    [[UIColor blackColor] setStroke];
    ovalPath.lineWidth = 1;
    [ovalPath stroke];

}

ここに画像の説明を入力してください

4

2 に答える 2

20

http://developer.apple.com/library/ios/#documentation/general/conceptual/Devpedia-CocoaApp/DrawingModel.htmlから

UIViewとNSViewは、drawRect:メソッドが呼び出される前に、ビューの描画環境を自動的に構成します。(AppKitフレームワークでは、描画環境の構成はロックフォーカスと呼ばれます。)この構成の一部として、ビュークラスは現在の描画環境のグラフィックスコンテキストを作成します。

このグラフィックスコンテキストは、適用する色、描画モード(ストロークまたは塗りつぶし)、線幅とスタイル情報、フォント情報、合成オプションなど、描画システムに必要な情報を含むQuartzオブジェクト(CGContext)です。(AppKitでは、NSGraphicsContextクラスのオブジェクトはCGContextオブジェクトをラップします。)グラフィックスコンテキストオブジェクトは、ウィンドウ、ビットマップ、PDFファイル、またはその他の出力デバイスに関連付けられ、そのエンティティの描画環境の現在の状態に関する情報を維持します。 。ビューは、ビューのウィンドウに関連付けられたグラフィックスコンテキストを使用して描画します。ビューの場合、グラフィックスコンテキストは、デフォルトのクリッピング領域をビューの境界と一致するように設定し、デフォルトの描画原点をビューの境界の原点に配置します。

クリッピング領域を設定すると、それを小さくすることしかできません。したがって、UIView drawRect:では、実行しようとしていることはできません。

于 2013-02-18T23:57:24.023 に答える
0

これで問題が解決するかどうかはわかりませんが、調査する必要があります。self.layer.masksToBounds = NO入力するたびに設定しますdrawRect。代わりに、initメソッド内で一度だけ設定してみてください。A)複数回行う必要がないため、B)drawRectすでに呼び出された後で設定に問題がある可能性があるため、誰が知っていますか。

于 2013-02-18T23:17:16.850 に答える