垂直alignmentUILabel

我正在尝试垂直alignment我的应用程序的UILabel视图中的文本。 问题是我想要文本垂直alignment的顶部和标签的大小为280×150。我只能实现这两件事情之一。 如果我删除线

[myLabel sizeToFit]; 

那么文本的alignment方式是可以的,但是大小是混乱的。 但是,如果我添加上面的行,那么alignment是乱了,但大小是正常的。 我如何解决这个问题。

我已经添加了下面的代码 –

 CGRect labelFrame = CGRectMake(22, 50, 280, 150); UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; [myLabel setText:finalRecipe]; [myLabel setBackgroundColor: [UIColor lightGrayColor]]; [myLabel setNumberOfLines:0]; [myLabel sizeToFit]; [self.view addSubview:myLabel]; 

我是FXLabel的作者,虽然我不认识Manish,但我相信他是在帮助我(如果他为我做广告,我当然不会问他,我也不会付钱给他 – 对不起马尼什!)。

FXLabel的特性之一就是它遵循“接口”构build器中设置的标签的UIContentMode属性。 这意味着你可以设置label.contentMode = UIViewContentModeTop; 将文本alignment到标签视图的顶部(对于常规的UILabel不起作用)。 相关的例子在这里:

https://github.com/nicklockwood/FXLabel/tree/master/Examples/Text%20Alignment

FXLabel是UILabel的一个embedded子类,所以我认为这是一个很好的解决scheme。 但是,如果海​​报宁愿解决问题,而不使用第三方库(这是可以理解的),那么这里是代码来做到这一点:

 CGRect labelFrame = CGRectMake(22, 50, 280, 150); UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; [myLabel setText:finalRecipe]; [myLabel setBackgroundColor: [UIColor lightGrayColor]]; [myLabel setNumberOfLines:0]; CGFloat fontSize = 0.0f; labelFrame.size = [myLabel.text sizeWithFont:myLabel.font minFontSize:myLabel.minimumFontSize actualFontSize:&fontSize forWidth:labelFrame.width lineBreakMode:myLabel.lineBreakMode]; myLabel.frame = labelFrame; [self.view addSubview:myLabel]; 

注意:(这是未经testing的,所以如果有任何错别字,请致歉)

不要使用UILabel这个。 用UserInteractionEnabled = NO;使用UIButton UserInteractionEnabled = NO; 并有select垂直或水平alignment文本里面。

干得好:

 [btnDetail.titleLabel setNumberOfLines:5]; [btnDetail.titleLabel setLineBreakMode:NSLineBreakByCharWrapping]; [btnDetail setContentVerticalAlignment:UIControlContentVerticalAlignmentTop]; [btnDetail setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; [btnDetail setUserInteractionEnabled:NO]; btnDetail.autoresizesSubviews = YES; btnDetail.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

你需要inheritanceUILabel。 尝试这个:

 - (void)drawTextInRect:(CGRect)rect { CGSize sizeThatFits = [self sizeThatFits:rect.size]; rect.size.height = MIN(rect.size.height, sizeThatFits.height); [super drawTextInRect:rect]; } 

正如你所发现的,UILabel将文本垂直居中在其范围内。 在这里,我们问-sizeThatFits文本块大小,并使用它来限制传递给UILabel的绘图矩形,以便从标签边界的顶部绘制文本。

你甚至可以像这样支持被忽略的(叹气) contentMode属性:

 - (void)drawTextInRect:(CGRect)rect { CGSize sizeThatFits = [self sizeThatFits:rect.size]; if (self.contentMode == UIViewContentModeTop) { rect.size.height = MIN(rect.size.height, sizeThatFits.height); } else if (self.contentMode == UIViewContentModeBottom) { rect.origin.y = MAX(0, rect.size.height - sizeThatFits.height); rect.size.height = MIN(rect.size.height, sizeThatFits.height); } [super drawTextInRect:rect]; } 

这里还有其他一些解决scheme和讨论: 在UILabel中垂直alignment文本

在Swift中,JRC的子类化UILabel的解决scheme,重写drawTextInRect并符合UIViewContentMode如下所示:

 class AlignableUILabel: UILabel { override func drawText(in rect: CGRect) { var newRect = CGRect(x: rect.origin.x,y: rect.origin.y,width: rect.width, height: rect.height) let fittingSize = sizeThatFits(rect.size) if contentMode == UIViewContentMode.top { newRect.size.height = min(newRect.size.height, fittingSize.height) } else if contentMode == UIViewContentMode.bottom { newRect.origin.y = max(0, newRect.size.height - fittingSize.height) } super.drawText(in: newRect) } } 

实施只是一个问题:

 yourLabel.contentMode = UIViewContentMode.top 

对我来说,它就像一个魅力。

有没有子类的方法,使用button或自己滚动。

设置行数为0,然后调用sizeToFit。

 [label setNumberOfLines:0]; [label sizeToFit]; 

更多的细节在这里,因为我认为别人链接到: 垂直文本顶部内UILabel

您可以在界面构build器上使用约束。

  1. 把你想要的行数
  2. 创build一个高度足够大的3行的约束,并在关系部分放置“小于或等于”。

希望这对你有所帮助!

我通过实施一个类别做到了你想要的:

。H

 @interface UILabel (VerticalAlign) - (void)alignTop; - (void)alignBottom; @end 

.M

 @implementation UILabel (VerticalAlign) #pragma mark #pragma mark - Align Methods - (void)alignTop { [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentTop]]; } - (void)alignBottom { [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentBottom]]; } #pragma mark #pragma mark - Helper Methods - (CGRect)newLabelFrame:(UIControlContentVerticalAlignment)alignment { CGRect labelRect = self.frame; NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading; CGRect textRect = [self.text boundingRectWithSize:CGSizeMake(227.f, CGFLOAT_MAX) options:options attributes:@{NSFontAttributeName:self.font} context:nil]; CGFloat textOffset = labelRect.size.height - textRect.size.height; UIEdgeInsets contentInsets; if (alignment == UIControlContentVerticalAlignmentTop) { if (textOffset < (labelRect.size.height/2.f)) { contentInsets = UIEdgeInsetsMake(-textOffset, 0.f, 0.f, 0.f); } else { contentInsets = UIEdgeInsetsMake(0.f, 0.f, textOffset, 0.f); } } else { if (textOffset < (labelRect.size.height/2.f)) { contentInsets = UIEdgeInsetsMake(0.f, 0.f, -textOffset, 0.f); } else { contentInsets = UIEdgeInsetsMake(textOffset, 0.f, 0.f, 0.f); } } return UIEdgeInsetsInsetRect(labelRect, contentInsets); } @end 

请记住,您需要将“NumberOfLines”设置为0.本示例适用于多行选项!

在实现上面的类别之后,您可以简单地执行:

 [myLabel setText:finalRecipe]; [myLabel alignTop]; 

干杯!

你可以做到这一点如下…….

  1. 从IB设置标签的numberOfLines属性0

  2. 将标签的lineBreakMode设置为UILineBreakModeWordWrap非常重要

现在无论你在标签上设置什么,只需附加几个@“\ n”….. ex.-

 [yourTextLabel setText:@"myLabel\n\n\n\n\n"];