垂直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器上使用约束。
- 把你想要的行数
- 创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];
干杯!
你可以做到这一点如下…….
-
从IB设置标签的
numberOfLines
属性0 -
将标签的
lineBreakMode
设置为UILineBreakModeWordWrap
( 非常重要 )
现在无论你在标签上设置什么,只需附加几个@“\ n”….. ex.-
[yourTextLabel setText:@"myLabel\n\n\n\n\n"];