2012-04-07 10 views
0

UILabelをサークルの中心に配置したいのですが、ラベルの位置に影響しないようです。 CGRectフレームの高さを変えるだけで、ラベルの位置に影響を与えるように見えます。他の値を変更しても、位置にはまったく影響しません。UILabelの位置を円にします

ここに私のCircle.mコードは、あなたがdrawRect:に新しいUIView Sを割り当てるべきではありません(とUILabelUIViewのサブクラスである)

- (id)initWithFrame:(CGRect)frame radius:(CGFloat)aRadius color:(UIColor*) aColor { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.opaque = NO; 

     [self setRadius:aRadius]; 
     [self setColor:aColor]; 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect 
{ 

    NSString *string = @"1"; 
    UIFont* font = [UIFont systemFontOfSize:80]; 
    UILabel *label = [[UILabel alloc] init]; 
    label.text = string; 
    label.textColor = [UIColor whiteColor]; 
    label.font = font; 

    CGRect frame = label.frame; 
    frame = CGRectMake(10, 10, 0, 85); 
    label.frame = frame; 

    CGContextRef contextRef = UIGraphicsGetCurrentContext(); 
    [color setFill]; 
    circle = CGRectMake(0, 0, radius, radius); 

    CGContextAddEllipseInRect(contextRef, circle); 
    CGContextDrawPath (contextRef, kCGPathFill); 
    [label drawRect:circle]; 

} 

と私のviewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    CGFloat radius = 70; 
    CGRect position = CGRectMake(0, 0, radius, radius); 
    Circle *myCircle = [[Circle alloc] initWithFrame:position radius:radius color:[UIColor redColor]]; 
    [self.view addSubview:myCircle]; 

} 
+0

あなたは0の高さは何も表示されないことを認識しない、右? – CodaFi

+0

合意すると、ラベルフレームの高さは0になりません。また、円の直径が少なくともその2倍であるため、「半径」の幅と高さを持つ円の枠を見るにはちょっと変です。ラベルの幅を円の2倍に設定するなどの単純な作業を行う場合は、ラベルが '[label setTextAlignment:UITextAlignmentCenter];を使用していることを確認したいでしょう。テキストがそのフレーム内で中央に揃っていることを確認するだけですか? – Rob

答えて

4

です。あなたが望むことをするにはいくつかの良い方法がありますが、UILabeldrawRect:に割り当てることはありません。

あなたのサークルに初期設定でUILabelサブビューを与え、ラベルの中心をlayoutSubviewsにする方法もあります。その後drawRect:で、あなただけの円を描画し、ラベルのテキストを描画する心配はありません。

@implementation Circle { 
    UILabel *_label; 
} 

@synthesize radius = _radius; 
@synthesize color = _color; 

- (id)initWithFrame:(CGRect)frame radius:(CGFloat)aRadius color:(UIColor*) aColor { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.opaque = NO; 

     [self setRadius:aRadius]; 
     [self setColor:aColor]; 

     _label = [[UILabel alloc] init]; 
     _label.font = [UIFont systemFontOfSize:80]; 
     _label.textColor = [UIColor whiteColor]; 
     _label.text = @"1"; 
     [_label sizeToFit]; 
     [self addSubview:_label]; 
    } 
    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    CGSize mySize = self.bounds.size; 
    _label.center = CGPointMake(mySize.width * 0.5f, mySize.height * 0.5f); 
} 

- (void)drawRect:(CGRect)rect { 
    [self.color setFill]; 
    CGSize mySize = self.bounds.size; 
    CGFloat radius = self.radius; 
    [[UIBezierPath bezierPathWithOvalInRect:CGRectMake(mySize.width * 0.5f, mySize.height * 0.5f, self.radius, self.radius)] fill]; 
} 
+0

ありがとうございます。 drawrectを複数回呼び出すことができるので、UIViewをdrawrectに割り当てたくない理由は何ですか?その方法で毎回ビューを再割り当てしますか? –

+0

文字列を描画するためだけに 'UILabel'を割り当ててはならず、' UILabel'を投げ捨ててください。文字列を描画したい場合は、はるかに安価なテキスト描画APIがあります。 'UILabel'をビュー階層の一部として保持しようとしている場合(例のコードのように)、文字列を描画するのに' UILabel'を使うのは大丈夫です。あなたの 'drawRect:'でビューを割り当てている場合は、非効率的に何かをしているという印です。 –

関連する問題