2016-05-20 7 views
2

シナリオiOSの - クォーツ親/子ビューで

を問題を描く私は2つの景色を眺めることができます。 1つは "親"ビューで、これは図面を実行する "子"ビューを含んでいます。私はそのコードをQuartzViewと呼んでいます。 QuartzViewは、それ自身のコンテキストに四角形を描く方法を知っています。

問題

私はそれは予想通り、それはそうする四角形を描画しselfだ上でQuartzViewを教えてください。 QuartusViewに親ビューを使用して正方形を描画するように指示すると、selfは、スクリーンの左下隅に四角形を約1/5のサイズで描画します。

質問

私はそこここにいくつかの親/子またはコンテキストの問題だが、私は彼らが何であるかわからないと仮定します。どのようにして2つの正方形を正確に同じ場所に正確に同じサイズで描画することができますか?

ViewController

- (void)drawASquare { 

    // this code draws the "goofy" square that is smaller and off in the bottom left corner 
    x = qv.frame.size.width/2; 
    y = qv.frame.size.height/2; 
    CGPoint center = CGPointMake(x, y); 
    [qv drawRectWithCenter:center andWidth:50 andHeight:50 andFillColor:[UIColor blueColor]]; 

} 

子供QuartzView

- (void)drawRect:(CGRect)rect 
{ 
    self.context = UIGraphicsGetCurrentContext(); 
    UIColor *color = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; 

    // this code draws a square as expected 
    float w = self.frame.size.width/2; 
    float h = self.frame.size.height/2; 
    color = [UIColor blueColor]; 
    CGPoint center = CGPointMake(w, h); 
    [self drawRectWithCenter:center andWidth:20 andHeight:20 andFillColor:color]; 
} 

- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color 
{ 
    CGContextSetFillColorWithColor(self.context, color.CGColor); 
    CGContextSetRGBStrokeColor(self.context, 0.0, 1.0, 0.0, 1); 

    CGRect rectangle = CGRectMake(center.x - w/2, center.x - w/2, w, h); 

    CGContextFillRect(self.context, rectangle); 
    CGContextStrokeRect(self.context, rectangle); 
} 

  • 不透明度は、両方の正方形のために同じである
  • ノー顕著な違い
  • view.contentScaleFactor = [[UIScreen mainScreen] scale];で「自動サイズ変更サブビューは」から始まる親が描かれたとき、私は、正方形のX/Yの値ということに気付いてい

編集

を助けていないオフ左下は0,0のままですが、通常は0,0が左上になります。

答えて

2

UIGraphicsGetCurrentContext()からの戻り値はdrawRectメソッド内でのみ有効です。他の方法では、そのコンテキストを使用することはできません。したがって、self.contextプロパティはローカル変数にする必要があります。

drawRectWithCenterメソッドでは、すべてのパラメータをプロパティに格納してから、[self setNeedsDisplay]でビューの更新を要求する必要があります。そうすれば、フレームワークはdrawRectに新しい情報を呼び出すでしょう。 drawRectWithCenter方法は、この

- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color 
{ 
    self.showCenter = center; 
    self.showWidth = w; 
    self.showHeight = h; 
    self.showFillColor = color; 
    [self setNeedsDisplay]; 
} 

そしてもちろんのようになるはずです、drawRect機能は、その情報を取り、適切な描画を行う必要があります。

+2

明示的には言及していない点があります。グラフィックスコンテキストを保存して再利用しようとしないでください。 – Caleb

+1

この回答の最初の文は一般的に真実ではありませんが、この質問のために十分に近いです。 'UIGraphicsGetCurrentContext()'が有効な他の有効な場所があります。しかし、OPはこれらの状況を使用していません。 – rmaddy

+0

@rmaddy十分に公正です。負の数の平方根をとることはできないと言っているようなものです。結局のところ、学生はより高度な概念を理解する準備ができていますが、最初は単純にしておくことが最善です。 – user3386109

2

ここには親子関係や文脈上の問​​題があると思いますが、その内容はわかりません。どのようにして2つの正方形を正確に同じ場所に正確に同じサイズで描画することができますか?

ココアタッチ-drawRect:を呼び出す前に、あなたのためのコンテキストを設定しますので、あなたは通常、あなたの-drawRect:方法でグラフィックスコンテキストを心配する必要はありません。しかし、ビューコントローラの-drawASquareメソッドでは-drawRectWithCenter:...が呼び出され、通常の描画プロセスの外に描画されるため、ビューにコンテキストが設定されていません。あなたは実際にビューを描画するには-drawRect:にする必要があります。

図面リストにビューを追加し、グラフィックスシステムは、グラフィックスコンテキストを設定し、ビューの -drawRect:を呼び出します
[qv setNeedsDisplay]; 

:あなたのビューコントローラは、ビューが再描画しようとしたとき、それは次のように、-setNeedsDisplayを呼び出す必要がありますあなたのために。

Iは、通常、0,0左上になり、一方、底部から出発親描か正方形のX/Yの値が0,0のままことを気づいています。

のUIKitとCoreアニメーション左上原点を使用するが、コアグラフィックス(別名石英)は、通常、左下原点を使用します。ドキュメントは言う:

The default coordinate system used by Core Graphics framework is LLO-based.

+0

これは確かに新しい情報ですが、それはこれまでのところ私だけになります。 1つのビューからの同じメソッドが両方の時間に使用されるため、なぜ1つの正方形がUIKitに描画され、もう1つの사각형がQuartzに描画されるのですか? – Jacksonkr

+1

@Jacksonkrコンテキストは '-drawRect:'が呼び出されたときにのみ設定されるためです。私は少し早く提出ボタンを押す、私の答えを更新しました。上記を参照。 – Caleb

関連する問題