Подтвердить что ты не робот

IPhone - входной параметр для метода UIView sizeThatFits

Подпись этого метода:

- (CGSize)sizeThatFits:(CGSize)size

Я не понимаю, для чего используется параметр размера. Apple documentation утверждает, что это "Текущий размер приемника".

Но приемник, по-видимому, знает свой текущий размер. Так зачем это нужно принимать?

Когда я экспериментально передаю другие значения, метод, похоже, все равно использует размер текущего приемника.

Может ли кто-нибудь объяснить? И есть ли случай, когда этот параметр имеет значение?

4b9b3361

Ответ 1

Прежде всего, этот метод - это свойство AppKit (не в отрицательном смысле слова).

Да, любое представление имеет текущий размер в любой момент и может извлечь его из свойства bounds. Но во время компоновки есть сложные ситуации, когда лучший размер зависит от нестационарных факторов. Возьмите текстовую метку, например. Он может протекать в одной или нескольких строках, а количество линий может зависеть от максимально допустимой ширины. Таким образом, возможная реализация UILabel может вывести размер границ от ширины CGSize, переданного в sizeThatFits:, в этом случае этот размер не является буквально текущим размером ресивера, а некоторым желаемым/предельным размером.

Таким образом, любой подкласс UIView может реализовать -sizeThatFits: поскольку он считает нужным (каламбур) и даже может игнорировать параметр размера. Чаще всего, когда я должен реализовать этот метод, я игнорирую его, потому что я могу рассчитать его из внутреннего состояния представления, но в более сложном сценарии вам может понадобиться использовать параметр размера, чтобы намекнуть о некоторых ограничениях в макете.

Ответ 2

Не только размер приемника - это размер потенциального размера, который вы хотите заполнить. В результате размер, который считает мнение, наилучшим образом отобразит его содержимое для данного ввода size.

Поведение по умолчанию - это просто вернуть параметр size (то есть размер, который соответствует представлению по умолчанию - это размер, который вы ему даете) - так что да, этот параметр имеет значение по умолчанию.

Подклассы могут применять ограничения, такие как width==height или другие подобные вещи, используя этот метод.