UIView с динамической высотой, которая использует intrinsicContentSize
Я пытаюсь создать пользовательское представление контейнера, которое имеет UIImageView и многострочный UILabel в качестве подвидов. Чтобы представление хорошо работало с autolayout, я переопределяю intrinsicContentSize как показано ниже:
- (CGSize)intrinsicContentSize
{
return [self sizeThatFits:self.bounds.size];
}
размер, рассчитанный в sizeThatFits, имеет одинаковую ширину и регулирует высоту, чтобы метка и изображение не обрезались. Это хорошо работает, но я был удивлен, увидев в документах следующий комментарий:
это внутренний размер должен быть независимо от фрейма содержимого, потому что нет способа динамически связывать измененную ширину с системой макета на основе измененной высоты, например.
Если это так, каков способ автозапуска для настройки текущей высоты представлений на основе ее ширины и содержимого? Должен ли я подойти к этому по-другому?
4 ответов
чтобы ответить на мой собственный вопрос, похоже,что нет подходящего решения для этой ситуации. Хотите UILabel
для вдохновения, проблема здесь была решена с добавлением свойства preferredMaxLayoutWidth
, который затем может использоваться как ограничивающая ширина во время вычисления внутреннего размера содержимого. Любое пользовательское представление должно использовать что-то подобное.
Я думаю, что doc означает, что ваш containerView
может быть placeHolderFrame
в рамке содержимого.
внутренний размер не должен быть связан с фреймом контента, а только с его собственным подсознанием. Например, ваш образ и UILabel.
вы должны рассчитать высоту и ширину от метки и изображения. Что должно быть легко, так как все они имеют внутренний размер.
только мое мнение...
Я думаю, вы могли бы использовать новый UILabel в preferredMaxLayoutWidth свойство для правильной разметки и использования других подходов к компоновке других материалов.
что-то вроде этого:
- (void)layoutSubviews
{
...
[super layoutSubviews]; // get width from solved constraints
label.preferredMaxLayoutWidth = label.frame.size.width; // use it
[super layoutSubviews]; // update height of a label (probably intrinsicContentSize)
...
}
выровняйте нижний край содержащего вида как с изображением, так и с меткой.
[self alignBottomEdgeWithView:labelView predicate:@"10"];
детали в http://code.dblock.org/ios-uiview-with-an-image-and-text-with-dynamic-height.