Как установить высоту UIView равную максимуму двух подпредставлений UILabel?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

2
задан Lukas Würzburger 14 April 2019 в 08:40
поделиться

1 ответ

Содержание Обнимая

Довольный объятие ведет более вероятно для сжатия маркировок. То, что Вы хотите, является высотой маркировок, которые будут более уважать. Таким образом, Вы использовали бы приоритет сопротивления сжатия. Однако Вам на самом деле не нужен ни один из тех.

Ограничения макета

, Так как Вы устанавливаете свои ограничения программно, необходимо будет установить translatesAutoresizingMaskIntoConstraints на false для маркировок также:

leftRow.translatesAutoresizingMaskIntoConstraints = false
rightRow.translatesAutoresizingMaskIntoConstraints = false

нижнее ограничение является на самом деле хорошим началом, но Вы не хотите соответствовать высоте меньшей маркировки излишне к высоте большей маркировки. Таким образом, Вы хотели бы добавить ограничение, которое "меньше чем или равно нижней привязке":

make.bottom.lessThanOrEqualTo(self.snp.bottom)

Ленивые Переменные

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

private lazy var leftRow: UILabel = {
    return UILabel() 
}()
private lazy var rightRow: UILabel = {
    return UILabel() 
}()

Однако в Вашем случае Вам не нужна ленивая загрузка, таким образом, можно инициализировать их непосредственно:

private let leftRow = UILabel()
private let rightRow = UILabel()

Другой

, Так как Вы используете ограничения макета, Вы не должны звонить sizeToFit на маркировках. Это ничего не делает.

Вызов layoutIfNeeded() в init ничего не делает, так как это назовут так или иначе, как только Вы добавите ComponentCell как подпредставление к любому другому представлению.

0
ответ дан Lukas Würzburger 14 April 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: