在Xcode中显示各种大小的文本块

时间:2014-02-22 19:29:35

标签: ios xcode

我正在创建一个问卷调查应用。在视图控制器中,我有一个问题显示为标签,然后我有三个答案显示为标签。问题是,如果问题有多行,那么无论如何它都会显示在一行中,如果我伸出标签,它会与答案重叠。

无论问题持续多长时间,显示问题的正确方法是什么,以便答案出现在问题的正下方?

A screenshot

2 个答案:

答案 0 :(得分:1)

如果要使用UILabel,首先必须将其“numberOfLines”属性设置为0.值“0”表示“无限制”,因此文本将以正确的行数分隔。然后你就有了确定标签大小的问题,因为高度根据问题的长度而变化。在这种情况下,您可以使用函数- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context(适用于iOS7,并取代iOS7之前可用的- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode)。 确定标签的高度后,相应地更改其框架。显然,您必须更改答案标签的来源,以避免它们与问题标签冲突。 请注意,如果问题和答案都太长,您的最终标签高度可能会高于屏幕高度。在这种情况下,您应将所有这些标签放在滚动视图中或作为表视图的单元格,以允许滚动。

答案 1 :(得分:1)

尝试将问题标签的属性numberOfLines设置为0,它将允许显示无限数量的行。然后使用iOS 7方法boundingRectWithSize:options:context:计算文本大小:

CGRect questionFrame = self.questionLabel.frame
CGFloat maxWidth = questionFrame.size.width;

NSString *questionText = [NSString stringWithString:@"lorem ipsum"]; // your text
UIFont *font = self.questionLabel.font; // your label font

// Temporary attributed string
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:questionText attributes:@{ NSFontAttributeName: font }];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){ maxWidth, CGFLOAT_MAX }
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

// Assign the new height
questionFrame.size.height = rect.size.height;
self.questionLabel.frame = questionFrame;


然后在问题标签下逐一移动答案标签:

CGRect answerFrame = self.answerLabel1.frame;
answerFrame.origin.y = questionFrame.origin.y + questionFrame.size.height;
self.answerLabel1.frame = answerFrame;

answerFrame.origin.y = answerFrame.origin.y + answerFrame.size.height;
self.answerLabel2.frame = answerFrame;

answerFrame.origin.y = answerFrame.origin.y + answerFrame.size.height;
self.answerLabel3.frame = answerFrame;