我有一个视图,该视图的最左边有一个标签,然后是一个带有用户名的按钮,然后在右边的按钮之后有他的评论。我想做的是将Label放置在UIButton的文本结尾处。在这种情况下,如果用户名长或短,则将在用户名按钮和注释标签之间没有空格的情况下开始注释。我目前正在像这样进行硬编码,如何根据UIButtion的文本大小实现UILabel的动态位置?PfButton是UIButton的子类谢谢

PfButton *button = [PfButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:name forState:UIControlStateNormal];
[button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[button setContentEdgeInsets:UIEdgeInsetsMake(0, 13, 0, 0)];
[button setObjectId:objId];
[button addTarget:self action:@selector(profilePhotoButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(30, -7, 130, 20)];
[[button titleLabel] setTextAlignment:NSTextAlignmentLeft];
[view addSubview:button];

UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(160, -7, 150, 20)];
[messageLabel setFont:[UIFont systemFontOfSize:15]];
[messageLabel setText:msg];
[messageLabel setTextAlignment:NSTextAlignmentLeft];
[view addSubview:messageLabel];
[messageLabel release];

最佳答案

如果要使按钮的宽度大于标签的宽度,或者更改按钮上的许多大小设置属性之一,则sizeToFit效果不佳。更好的解决方案是将titleLabel的坐标系简单地转换为按钮超级视图。

CGRect buttonTitleFrame = button.titleLabel.frame;
CGRect convertedRect = [button convertRect:button.titleLabel.frame toView:button.superview];
CGFloat xForLabel = convertedRect.origin.x + buttonTitleFrame.size.width;
CGRect currentLabelFrame = label.frame;
CGRect labelFrame = CGRectMake(xForLabel, currentLabelFrame.origin.y, currentLabelFrame.size.width, currentLabelFrame.size.height);
label.frame = labelFrame;


第二行是这里的关键。您要求按钮将其内的矩形(在本例中为标题标签)转换为另一个视图中的矩形(在本例中为按钮超级视图,这可能是您的视图控制器self.view)。

第3行采用转换后的原点,并添加标签的确切宽度,第5行使用标签框架中除x以外的值,x是我们计算出的值。

10-04 14:46