У меня есть решение, которое, кажется, работает, но я хочу убедиться, что он безопасен и использует инструмент по назначению. Я могу решить эту проблему до этого сценария - у меня есть UIView, который содержит несколько UILabels, уложенных вертикально. Каждая метка может быть заполнена произвольным текстом, который обертывает и расширяет этикетку по вертикали. Ограничения автоматической компоновки для складывания меток в представлении тривиальны. Я бы хотел, чтобы UIView сообщал свою предпочтительную высоту (высота представления должен соответствовать всем ярлыкам) своему владельцу через intrinsicContentSize
. Однако внутренняя компоновка должна быть решена, прежде чем я смогу вернуть соответствующую высоту. Я понимаю, что после возвращения из [super layoutSubviews]
решатель будет завершен, это то, что я делаю:
- (void)layoutSubviews
{
[super layoutSubviews];
// solver complete, now we can measure?
[self invalidateIntrinsicContentSize];
}
My intrinsicContentSize
реализация относится к последнему кадру ярлыка, чтобы определить высоту. Это все, кажется, работает для моего нынешнего дела, но это заставляет меня нервничать. Похоже, что решатель запрашивает внутреннее значение ContanceSize текущего представления, в то время как он создает свои внутренние элементы. Я не буду вдаваться в подробности, но я столкнулся с ситуацией, в которой этот шаблон превратился в бесконечный цикл. Я смог исправить эту проблему, изменив некоторые из моего кода макета - это не внушало доверия.
Есть ли лучший способ сделать это? Это похоже на то, что хочется делать, и когда я начал работать над проблемой, я думал, что это то, для чего был intrinsicContentSize. Реализации intrinsicContentSize, которые я видел, всегда были тривиальными - жестко запрограммированными размерами для измерения или измеряли единое представление, которое не зависит от разрешенной внутренней компоновки.
Примечание. Я не могу просто использовать метки меток с помощью методов NSString sizeWith...
, потому что внутренний макет слишком сложный.
Примечание. Я изучил с помощью systemLayoutSizeFittingSize:
, но вызов этого из intrinsicContentSize приводит к бесконечному циклу.
Любой ответ будет оценен! Спасибо заранее!