2012-04-07 1 views
0

Я хочу разместить UILabel в центре моего круга, но я не могу повлиять на положение метки. Я могу только повлиять на положение метки, изменив высоту кадра CGRect. изменение других значений вообще не влияет на позицию.Позиция UILabel в круге

вот мой Circle.m код

- (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 высота рамки метки не имеет смысла. А также немного странно видеть рамку круга с шириной и высотой «радиуса», потому что диаметр круга по крайней мере вдвое больше, верно? И если вы собираетесь сделать что-то простое, например, чтобы ширина метки была в два раза больше радиуса круга, вы, вероятно, также захотите убедиться, что ваша метка использует '[label setTextAlignment: UITextAlignmentCenter];', правильно? Просто чтобы убедиться, что текст выровнен по центру внутри этого кадра? – Rob

ответ

4

Вы не должны быть выделения новых UIView с в drawRect:UILabel подкласс UIView). Есть несколько хороших способов сделать то, что вы хотите, но ни один из них не предполагает выделения нового UILabel в drawRect:.

Один из способов - сделать ваш круг предоставленным подкатегом 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

Благодарим вас за код. является причиной того, что вы не хотите выделять UIViews в drawrect, потому что drawrect может вызываться несколько раз? и таким образом вы каждый раз перераспределяете представления? –

+0

Вы не должны выделять 'UILabel', чтобы просто нарисовать строку, а затем выбросить' UILabel'. Существуют API-интерфейсы для рисования текста, которые намного дешевле, если вы просто хотите нарисовать строку. Можно использовать 'UILabel', чтобы нарисовать строку, если вы собираетесь хранить эту' UILabel' как часть вашей иерархии представлений (как это делает мой пример кода). Если вы выделяете представления в свой 'drawRect:', это знак того, что вы делаете что-то неэффективно. –