垂直对齐UILabel

问题描述 投票:10回答:9

我试图在我的应用程序的UILabel视图中垂直对齐文本。问题是我希望文本垂直对齐顶部,标签的大小为280 x 150.我只能实现这两件事之一。如果我删除该行

[myLabel sizeToFit];

然后文本的对齐没问题但是大小搞砸了。但是如果我添加上面的行,那么对齐就搞砸了但是大小没问题。我该如何解决这个问题。

我已添加以下代码 -

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];
ios xcode uilabel
9个回答
12
投票

我是FXLabel的作者,虽然我不认识Manish,但我相信他正在努力帮助(如果他为我做广告,我当然没有要求他,而且我没有付钱给他 - 抱歉马尼什!)。

FXLabel的一个特性是它尊重标签的UIContentMode属性,如“接口”构建器中所设置的那样。这意味着你可以设置label.contentMode = UIViewContentModeTop;将文本对齐到标签视图的顶部(这对常规UILabel不起作用)。相关的例子在这里:

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

FXLabel是UILabel的一个子类,所以我认为对于提出的问题来说这是一个非常好的解决方案。但是,如果海​​报宁愿在不使用第三方库的情况下解决问题(这是可以理解的),那么这里是代码:

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];

注意:(这是未经测试的,如果有任何拼写错误,请道歉)


17
投票

不要使用qazxsw poi。将qazxsw poi与qazxsw poi一起使用,并且可以选择垂直或水平对齐文本。

干得好:

迅速:

UILabel

OBJ-C

UIButton

12
投票

你需要继承UILabel。试试这个:

UserInteractionEnabled = NO;

正如您所发现的那样,UILabel将文本垂直居中于其范围内。这里我们向btnDetail.titleLabel?.numberOfLines = 5 btnDetail.titleLabel?.lineBreakMode = .byCharWrapping btnDetail.contentVerticalAlignment = .top btnDetail.contentHorizontalAlignment = .left btnDetail.isUserInteractionEnabled = false btnDetail.autoresizesSubviews = true btnDetail.autoresizingMask = .flexibleWidth 询问文本块大小,并使用它来约束传递给UILabel的绘图矩形,以便从标签边界的顶部绘制文本。

您甚至可以支持忽略(叹气)[btnDetail.titleLabel setNumberOfLines:5]; [btnDetail.titleLabel setLineBreakMode:NSLineBreakByCharWrapping]; [btnDetail setContentVerticalAlignment:UIControlContentVerticalAlignmentTop]; [btnDetail setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; [btnDetail setUserInteractionEnabled:NO]; btnDetail.autoresizesSubviews = YES; btnDetail.autoresizingMask = UIViewAutoresizingFlexibleWidth; 属性,如下所示:

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

    [super drawTextInRect:rect];
}

这里有一堆其他解决方案和讨论:-sizeThatFits


9
投票

在Swift中,JRC的子类化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]; } 并符合Vertically align text to top within a UILabel将如下所示:

UILabel

实施只是一个问题:

drawTextInRect

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


1
投票

有一种没有子类化的方法,使用按钮或自己滚动。

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

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) } }


1
投票

您可以在接口构建器上使用约束来创建它。

  1. 放置所需的行数
  2. 创建一个高度足够大的约束3行,在关系部分放置“小于或等于”。

希望这对你有所帮助!


0
投票

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

。H

yourLabel.contentMode = UIViewContentMode.top

.M

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

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

实现上述类别后,您可以简单地执行以下操作:

Vertically align text to top within a UILabel

干杯!


0
投票

很好的黑客...我的两分钱快速4.2 / 5:

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

并按建议添加\ n .. ..


-2
投票

你可以这样做.......

  1. 从IB设置标签的@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 属性0
  2. 将您的标签[myLabel setText:finalRecipe]; [myLabel alignTop]; 设为self.optTextMessage.numberOfLines = 0 self.optTitle.lineBreakMode = .byWordWrapping (非常非常重要)

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

numberOfLines
© www.soinside.com 2019 - 2024. All rights reserved.