Как обработать кейс, когда не нужно показывать ни фотоаппарат, ни кастомную иконку в UIView?
Что проверяют
Вопрос выглядит мелким, но проверяет две вещи: как вы моделируете состояние вью и как ведёт себя вёрстка, когда элемент пропадает. Следом обычно спрашивают, что станет с отступами и с переиспользуемой ячейкой.
Как отвечать
Начните с модели. Два флага showCamera и showCustomIcon дают четыре комбинации, одна из которых бессмысленна. Лучше перечисление, где третье состояние задано явно: enum AccessoryIcon { case camera, custom(UIImage), none }. Вью получает его в одном методе configure(with:) и через switch решает, что показать. Для .none важно, как свёрстан экран:
- внутри
UIStackView: достаточноisHidden = true. Стек сам исключает скрытые arranged subviews из раскладки, иspacingза ними тоже пропадает; - на обычных констрейнтах: скрытая вью продолжает занимать место. Держите ссылку на констрейнт ширины и переключайте его константу или активность, либо заведите два набора констрейнтов и переключайте их целиком;
- в ячейках: сбрасывайте состояние в
prepareForReuse()или всегда вызывайтеconfigureсо всеми полями, иначе иконка из прошлой строки проявится там, где её быть не должно; - доступность: скрытую вью VoiceOver не читает, но если вместо скрытия вы просто обнуляете картинку, уберите элемент из доступности через
isAccessibilityElement = false.
В SwiftUI тот же кейс решается проще: опциональное значение и if let или switch внутри body, пустая ветка ничего не рендерит и места не занимает.
Где спотыкаются
Моделируют состояние парой Bool. Рано или поздно кто-то выставит оба в true, и на экране окажутся две иконки поверх друг друга.
Скрывают вью на обычных констрейнтах и получают дыру в вёрстке, после чего начинают подгонять отступы вручную под каждый случай.
Удаляют вью через removeFromSuperview(), а при следующем показе добавляют обратно. Констрейнты к супервью удаляются вместе с ней, и их приходится собирать заново.