Я сталкивался с подобной проблемой, имел ограниченную ширину для своих кнопок и хотел, чтобы они росли вертикально, в зависимости от объема текста, который я им дал.В итоге я получил простое решение, основанное на том, что я узнал из документации Apple (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html)
У меня есть подклассы UIButton
и переопределены две функции:
- (void)setBounds:(CGRect)bounds {
if (!CGRectEqualToRect(bounds, self.bounds)) {
[self invalidateIntrinsicContentSize];
}
[super setBounds:bounds];
}
- (CGSize)intrinsicContentSize {
//
CGSize size;
self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x,
self.titleLabel.frame.origin.y,
self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right,
0);
size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size];
size = CGSizeMake(size.width, size.height + 20);
return size;
}
Здесь в основном происходит то, что кнопка делает недействительным свой собственный размер (только когда установленные границы действительно новые - это предотвращает бесконечный цикл), и когда система запрашивает размер внутреннего содержимого, я пересчитываю это на основе шириныкнопки. Дополнительная высота 20px для заполнения. Я пробовал много других способов, но так как мой макет основан на AutoLayout, я хотел что-то, что мне не нужно обновлять, когда устройство вращается или около того. Это просто работает.
Удачи! Z.