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.