13

内部drawRect:のこのコードが機能する理由はわかりません。

UIBezierPath *buildingFloor = [[UIBezierPath alloc] init];
// draw the shape with addLineToPoint
[[UIColor colorWithRed:1 green:0 blue:0 alpha:1.0] setFill]; // I'm sending setFill to UIColor object?
[buildingFloor fill]; // Fills it with the current fill color

私のポイントは、UIColorオブジェクトがメッセージsetFillを受け取り、スタックがこれが塗りつぶしの色になることをどういうわけか理解するということです。これUIColorは奇妙で間違っているだけではありませんか? 少なくとも、何らかのCGContextメソッドを呼び出して塗りつぶしを設定することを期待しています...しかし、色を表す代わりにUIColor、描画のコンテキストを変更するために何かを実行します。

私はここで完全に迷っているので、誰かが舞台裏で何が起こっているのか説明してもらえますか?

投稿する前に、これらの参照を確認しました。

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIColor_Class/Reference/Reference.html http://developer.apple.com/library/ios/#documentation/uikit/reference/UIBezierPath_class /参照/参照.html

4

2 に答える 2

14

私の要点は、UIColor オブジェクトがメッセージ setFill を取得すると、どういうわけかスタックがこの UIColor が塗りつぶしの色になることを理解するということです。これは奇妙で間違っているだけではありませんか? 少なくとも、いくつかの CGContext メソッドを呼び出して塗りつぶしを設定することを期待しています... しかし、色を表す代わりに、UIColor が続き、描画のコンテキストを変更するために何かを行います。

これはすべて、現在のCGContext 内で行われているためです。これが、現在の CGContextが存在する場合にのみコードが機能する理由です (たとえば、ブロック内drawRect:またはUIGraphicsBeginImageContextWithOptionsブロック内に存在するため)。

iOS 学習のこの段階で、私の本の「描画」の章を読むと、おそらく大いに役立つでしょう: http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

于 2013-05-09T16:36:42.790 に答える
7

の実装はUIColor setFill、現在のグラフィックス コンテキストを取得し、その現在のコンテキストで色を設定するように記述されています。基本的に、これはあなたのためにこれを行います:

UIColor *color = ... // some color
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, color.CGColor);
于 2013-05-09T16:37:28.703 に答える