Я прошу этот (каким-то образом) простой вопрос просто быть утонченным, потому что иногда меня беспокоит неправильное использование, которое я могу использовать для многих API UIView, особенно когда дело доходит до автозапуска.
Чтобы сделать его супер простым, я приведу пример, допустим, мне нужен подкласс UIView, у которого есть значок изображения и многострочная метка; поведение, которое я хочу, состоит в том, что высота моего представления изменяется с высотой метки (чтобы соответствовать тексту внутри), также я откладываю ее с помощью Interface Builder, поэтому у меня есть что-то вроде этого:
с некоторыми ограничениями, которые обеспечивают фиксированную ширину и высоту изображения, а также фиксированную ширину и положение (относительно изображения):
Теперь, если я устанавливаю какой-либо текст на метку, я хочу, чтобы представление было изменено по высоте, чтобы оно соответствовало ему, или осталось с той же высотой, что и в xib. Перед автозапуском я бы всегда делал что-то вроде этого:
В файле подкласса CustoView я бы переопределил sizeThatFits:
следующим образом:
- (CGSize) sizeThatFits:(CGSize)size{
//this stands for whichever method I would have used
//to calculate the height needed to display the text based on the font
CGSize labelSize = [self.titleLabel intrinsicContentSize];
//check if we're bigger than what in ib, otherwise resize
CGFloat newHeight = (labelSize.height <= 21) ? 51: labelSize.height+20;
size.height = newHeight;
return size;
}
И чем я бы назвал что-то вроде:
myView.titleLabel.text = @"a big text to display that should be more than a line";
[myView sizeToFit];
Теперь, рассуждая о ограничениях, я знаю, что системы автоопределения вызывают intrinsicContentSize
в элементах дерева представлений, чтобы узнать, что их размер, и выполнить его вычисления, поэтому я должен переопределить intrinsicContentSize
в моем подпункте, чтобы вернуть то же самое он возвращается в ранее описанном методе sizeThatFits:
, за исключением того факта, что ранее при вызове sizeToFit
я правильно изменил свой вид, но теперь с автозапуском в сочетании с xib это не произойдет.
Конечно, я мог бы называть sizeToFit
каждый раз, когда редактирую текст в своем подклассе вместе с переопределенным intrinsicContentSize
, который возвращает тот же самый размер sizeThatFits:
, но почему-то я не думаю, что это правильно способ сделать это.
Я думал об переопределении needsUpdateConstraints
и updateConstraints
, но все же не имеет большого смысла, так как моя ширина и высота представления выводятся и переводятся из маски авторезистирования из xib.
До тех пор, как вы считаете, самый чистый и самый правильный способ сделать именно то, что я показываю здесь, и полностью поддерживать автозапуск?