我正在创建一个问卷调查应用。在视图控制器中,我有一个问题显示为标签,然后我有三个答案显示为标签。问题是,如果问题有多行,那么无论如何它都会显示在一行中,如果我伸出标签,它会与答案重叠。
无论问题持续多长时间,显示问题的正确方法是什么,以便答案出现在问题的正下方?
答案 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;