4

私は次のことをしました:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{

      UIGraphicsPushContext ( ctx );

      CGRect r = CGRectMake( 500, 300, 200, 100 );
      NSString *text = [[NSString alloc] initWithString:@"raaaaaaaa!"];
      UIColor *color = [ UIColor colorWithRed: (200.0f)  green: (100.0)  blue:(200.0f) alpha: 1.0f ];
      [color set];

      [ text drawInRect: r withFont:[UIFont systemFontOfSize:50] lineBreakMode: UILineBreakModeWordWrap alignment: UITextAlignmentLeft ];
      [text release];

      UIGraphicsPopContext();
    }
  }
}

上記のコードは機能していません。なんで?

代わりに次のことを行うと、機能しています。

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
      UIGraphicsPushContext ( ctx );

      CATextLayer *label = [[CATextLayer alloc] init];
      [label setFont:@"Didot"];
      [label setFontSize:50];  
      [label setFrame:CGRectMake( 400, 300, 400, 100 )];
      [label setString:@"Helloooooooooooooooooo"];
      [label setAlignmentMode:kCAAlignmentCenter];
      [label setForegroundColor:[[UIColor blueColor] CGColor]];
      [layer addSublayer:label];
      [label release];

      UIGraphicsPopContext();
  }
}

違いは何ですか?drawInRectが何もしないのはなぜですか?

ありがとうございました

編集 それで、私はUIColorを適切に使用していなかったので、私は変更しました

UIColor *color = [ UIColor colorWithRed: (200.0f)  green: (100.0)  blue:(200.0f) alpha: 1.0f ];

このため

UIColor *color = [UIColor colorWithRed:200 / 255.0 green:100 / 255.0 blue: 200 / 255.0 alpha: 1.0];

それでも運が悪いので、drawInRectを使用するとテキストが表示されません

4

3 に答える 3

7

あなたの質問には2つの質問があります:

上記のコードは機能していません。なんで?

白地に白で描かれているので、最初は文字が出ないと思いました。それはまだそうだったかもしれませんが、それだけが問題ではありません。

テキストを描画する長方形(r)は、描画するレイヤーの境界を基準にしています。つまり、レイヤーの左上隅に描画する場合、四角形の原点は(0、 0)。上記のコードはまだ機能していません。

drawInRect:withFont:...が返すCGSize(レンダリングされたテキストのサイズ)を調べると、レンダリングされたテキストのサイズが0幅であることがわかります。これは、長方形を描画するための100の高さが十分でないことを示しています。長方形の高さを増やすとこれが解決され、テキストが表示されます。レイヤー内にテキストを描画する場合、描画するのに最も適切な長方形は、レイヤーの境界(CGRect r = [layer bounds];)です。

それを機能させるために私がしたこと:

  • テキストの色を変更しました
  • の原点rを(0,0)に変更しました
  • の高さの増加r

違いはなんですか [...] ?

最初は、レイヤーのグラフィックスコンテキスト(drawLayer:inContext:が行うことになっていること)にテキストを描画していますが、2番目の例では、レイヤー内に描画する代わりに、レイヤーの階層に別のレイヤーを追加しています。レイヤーが再描画されるたびに、新しいテキストレイヤーがレイヤーに追加されます。したがって、実際にはレイヤーのグラフィックスコンテキストには何も描画されません。

レイヤーがそれ自体を描画した後(空)、次に何が起こるかというと、レイヤーのサブレイヤーがそれ自体を描画し、それらのコンテンツがレイヤーの上に構成されます。これが、テキストレイヤーのテキストが表示される理由です。

このようなテキストレイヤーを追加すると、手動で描画する必要がなくなるため、コードをより効率的にすることができます。これには、テキストレイヤーが以前の時点(1回のみ)でレイヤーに追加され、カスタム描画を行わないことが必要です(多くの場合、時間がかかります)。

于 2012-08-02T07:02:30.297 に答える
1

UIColorのクラスリファレンスを読んだ場合のみ...

UIColor *color = [UIColor colorWithRed:200 / 255.0 green:100 / 255.0 blue: 200 / 255.0 alpha: 1.0];

あなたの問題を解決します。

于 2012-08-01T20:11:53.267 に答える
0

フレームの座標が間違っているのではないかと思います。

 CGRect r = CGRectMake( 500, 300, 200, 100 );
[label setFrame:CGRectMake( 400, 300, 400, 100 )];

iPhoneの画面サイズは320*460または320* 568(iPhone5)であることに注意してください。コードでは、画面の向こう側にあるx座標400と500を設定します。

座標はx<=320に従う必要があることに注意してください。そうでない場合、これをスクロールビューに追加しない限り、画面に表示されません。

于 2013-06-24T19:40:26.847 に答える