6

私は自分のアプリに次のことを実装しようとしています:

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ます。なぜ何かアイデアはありますか?

4

3 に答える 3

4
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];
于 2013-02-25T14:30:38.853 に答える
3

sizeThatFitsは、サブビューに最適なサイズを計算して返すようにビューに要求します。したがって、themeLabelのフレームを設定することはありません

やったほうがいい:

themeLabel.numberOfLines = 0;
CGSize size = [themeLabel sizeThatFits:CGSizeMake(274, 274)];
themeLabel.frame = (CGRect) {0,0, size};
于 2013-02-25T14:29:44.843 に答える
2

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

このカテゴリは属性付き文字列を処理せず、文字にクリップするように行の折り返しを設定する必要があることに注意してください。

于 2013-02-25T14:38:36.913 に答える