【问题标题】:Does UILabel's sizeThatFits return its height?UILabel 的 sizeThatFits 是否返回它的高度?
【发布时间】:2013-02-25 14:19:56
【问题描述】:

我正在尝试在我的应用中实现以下内容:

themeLabel = [[UILabel alloc] init];
themeLabel.backgroundColor = [UIColor redColor];
themeLabel.text = themeString;
[themeLabel sizeThatFits:CGSizeMake(274, 274)];
themeLabel.numberOfLines = 0;
[topThemeView addSubview:themeLabel];

NSLog(@"Height is %f ", themeLabel.frame.size.height);

[themeLabel setFrame:CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 274, themeLabel.frame.size.height)];

我最终得到Label's 的高度,即0.0。任何想法为什么?

【问题讨论】:

  • 返回的宽度是多少?
  • 高度表示为CGFloat,所以nil没有意义。
  • sizeThatFits: 返回一个 CGSize,您将忽略它。
  • 不,您正在丢弃 sizeThatFits: 返回的内容,因此调用无效。
  • 它应该看起来像:CGSizefittingSize = [themeLabel sizeThatFits:CGSizeMake(274, 274)];`

标签: iphone ios objective-c cocoa-touch uilabel


【解决方案1】:
themeLabel = [[UILabel alloc] init];
themeLabel.backgroundColor = [UIColor redColor];
themeLabel.text = themeString;
themeLabel.numberOfLines = 0;

CGRect labelFrame = CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 0.0, 0.0);
labelFrame.size = [themeLabel sizeThatFits:CGSizeMake(274, 274)];

[themeLabel setFrame:labelFrame];
[topThemeView addSubview:themeLabel];

【讨论】:

    【解决方案2】:

    sizeThatFits 要求视图计算并返回最适合其子视图的大小。所以你永远不会设置 themeLabel 的框架

    你应该这样做:

    themeLabel.numberOfLines = 0;
    CGSize size = [themeLabel sizeThatFits:CGSizeMake(274, 274)];
    themeLabel.frame = (CGRect) {0,0, size};
    

    【讨论】:

    • 您不能将CGSize 分配给需要CGRect 的属性。
    【解决方案3】:

    我为 UILabels 创建了一个处理高度的类别:

    UILabel+TCFlexibleHeight.h

    #import <UIKit/UIKit.h>
    
    @interface UILabel (TCFlexibleHeight)
    
    - (CGFloat)heightForText:(NSString*)text;
    - (CGFloat)heightForCurrentText;
    - (CGFloat)adjustHeightForCurrentText;
    
    @end
    

    UILabel+TCFlexibleHeight.m

    #import "UILabel+TCFlexibleHeight.h"
    
    static const NSInteger kMaxLines = 1000;
    
    @implementation UILabel (TCFlexibleHeight)
    
    - (CGFloat)heightForText:(NSString*)text {
        if (text == nil) {
            return 0;
        }
    
        NSInteger numberOfLines = self.numberOfLines > 0 ? self.numberOfLines : kMaxLines;
        CGSize size = CGSizeMake(self.frame.size.width, self.font.lineHeight * numberOfLines);
        return [text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode].height;
    }
    
    - (CGFloat)heightForCurrentText {
        return [self heightForText:self.text];
    }
    
    - (CGFloat)adjustHeightForCurrentText {
        CGFloat height = [self heightForCurrentText];
        CGRect frame = self.frame;
        frame.size.height = height;
        return height;
    }
    
    @end
    

    使用此类别,您的代码将如下所示:

    [themeLabel setFrame:CGRectMake(leftMargin, mainScrollView.frame.origin.y + topPadding, 274, [themeLabel heightForCurrentText])];
    

    请注意,此类别不处理属性字符串,并且需要将换行设置为剪辑到字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2016-05-16
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多