【问题标题】:Top aligned UILabel, make text stick to top of label view -ios顶部对齐的UILabel,使文本贴在标签视图的顶部-ios
【发布时间】:2012-08-05 17:13:16
【问题描述】:

有没有办法“顶部对齐” UILabel,即让文本贴在标签视图的顶部?与垂直居中对齐或浮动在视图中心相反,默认情况下?

这是三个标签的图像,左、右和中心对齐,以及一个居中和顶部对齐的 UITextView。无论视图的垂直大小如何,textView 的文本都会粘在顶部。我可以对标签做同样的事情吗?

【问题讨论】:

  • 这是我对类似问题的回答:stackoverflow.com/questions/1054558/…
  • 这个链接为我做了。谢谢内文王!和我有同样问题的人可以去上面的链接,或者在下面查看我的回答,我想你会找到解决办法的。
  • QUICK TRICK ...简单的sizeToFit

标签: iphone objective-c ios xcode


【解决方案1】:

在 iOS 中,默认情况下无法设置 UILabel 的垂直对齐方式。相反,您需要使用NSString 提供的sizeWithFont 方法之一。您使用哪一个取决于您需要多行标签还是单行标签。 sizeWithFont:forWidth:lineBreakMode: 可用于单行标签,sizeWithFont:constrainedToSize:lineBreakMode: 可用于多行标签。您可以使用相关标签的font 属性轻松加载字体参数。您可以查看here 了解有关使用这些功能的更多详细信息。

这些方法将根据NSString 中的文本返回具有最小标签大小的CGSize 结构。一旦你有了正确的标签大小,你就可以很容易地将它放在你的超级视图的顶部,它会看起来是顶部对齐的。

【讨论】:

  • 您也可以在标签上调用 sizeToFit 将框架设置为其内容。
【解决方案2】:

我在对我的问题的评论中使用了上面来自nevan king 的链接答案:Vertically align text to top within a UILabel

我使用的代码在这里:

- (void)setUILabelTextWithVerticalAlignTop:(NSString *)theText {
    CGSize labelSize = CGSizeMake(250, 300);
    CGSize theStringSize = [theText sizeWithFont:targetLabel.font constrainedToSize:labelSize lineBreakMode:targetLabel.lineBreakMode];
    targetLabel.frame = CGRectMake(targetLabel.frame.origin.x, targetLabel.frame.origin.y, theStringSize.width, theStringSize.height);
    targetLabel.text = theText;
}

//linked to a button that sets the text from a UITextView to the label.
- (IBAction)setText:(id)sender {

    [sourceText resignFirstResponder];
    [self setUILabelTextWithVerticalAlignTop:sourceText.text];
    [targetLabel setNumberOfLines:0];
    [targetLabel sizeToFit];

}

这是项目:

owolf.net/uploads/StackOverflow/verticalAlignUILabel.zip

【讨论】:

  • 为我工作,更新了 iOS 11 代码:UILabel *iconLabel = [UILabel.alloc initWithFrame:CGRectMake(0, 0, size, size)]; [iconLabel setTextColor:[UIColor whiteColor]]; [iconLabel setTextAlignment:NSTextAlignmentCenter]; CGSize labelSize = iconLabel.frame.size; iconLabel.frame = [icon boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil]; [iconLabel setText:icon]; [iconLabel setNumberOfLines:1]; [iconLabel sizeToFit]; return iconLabel;
【解决方案3】:

我已经用 UITextView 替换了 UILabel,因为在 UITextView 中,文本会粘在顶部。

只是一个建议,它可能对某人有用。

【讨论】:

  • 对我有用 :) 如何让它多行呢?我似乎找不到允许这样做的选项:/
  • 是的,它可以工作,但请告诉我应该如何更改它的字体大小。我在自定义单元格上有我的 TextView。
【解决方案4】:

有一个解决方法:

  1. 将高度和宽度 constraint 设置为您的 UILabel,并使用常量
  2. number of lines 设置为零。
  3. storyboard 中的高度设置为仅适合一行。
  4. 在您的代码中设置UILabel 的文本后调用sizeToFit

这将使您的 UILabel 在您想要的最大宽度和高度范围内调整大小,并且文本将始终顶部对齐。

【讨论】:

  • 同时将高度约束设置为 >= 无论原始高度是多少,都将允许标签增长并与容器中的文本保持左上角。
  • UICollectionViewCell 遇到了这个问题。常规 sizeToFit 不起作用。您的自动布局建议在这种情况下有效。谢谢!
  • 感谢您的帖子,对于那些想知道的人来说,它在 iOS 11 上就像一个魅力:)
  • 确保您使用
  • 第 1 步和第 3 步是什么意思?
【解决方案5】:

创建一个 UILabel 的子类

.h 文件

@property (nonatomic, assign) UIControlContentVerticalAlignment verticalAlignment;

.m 文件

- (void) drawTextInRect:(CGRect)rect 
{
    if(_verticalAlignment == UIControlContentVerticalAlignmentTop ||  _verticalAlignment == UIControlContentVerticalAlignmentBottom)    
    {
         // If one line, we can just use the lineHeight, faster than querying sizeThatFits
         const CGFloat height = floorf(((self.numberOfLines == 1) ? ceilf(self.font.lineHeight) : [self sizeThatFits:self.frame.size].height));
          rect.origin.y = floorf(((self.frame.size.height - height) / 2.0f) * ((_verticalAlignment == UIControlContentVerticalAlignmentTop) ? -1.0f : 1.0f));
    }
    [super drawTextInRect:rect];
}


- (void) setVerticalAlignment:(UIControlContentVerticalAlignment)newVerticalAlignment
{
     _verticalAlignment = newVerticalAlignment;
     [self setNeedsDisplay];
}

我将它用于垂直对齐。

【讨论】:

    【解决方案6】:

    对于标签高度不需要保持不变的情况,有一个简单的解决方案:将您的Label 放入Stack View。请务必将前导和尾随常量添加到 Stack View。 这是如何在情节提要中执行此操作的屏幕截图:

    【讨论】:

      【解决方案7】:

      我在我的应用程序中所做的是将 UILabel 的 line 属性设置为 0,并创建 UILabel 的底部约束,并确保将其设置为 >= 0,如下图所示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        相关资源
        最近更新 更多