Добавьте ButtonStyle, который меняет scaleEffect по configuration.isPressed и анимирует только это состояние.
Кнопка с анимацией сжатия при нажатии
Добавьте ButtonStyle, который меняет scaleEffect по configuration.isPressed и анимирует только это состояние.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать кнопку, которая при взаимодействии визуально уменьшается вдвое, что удобно использовать в дизайн‑системе для анимированного отклика.
struct ShrinkButton: View {
var label: String
var onTap: () -> Void
var body: some View {
Button(action: onTap) {
Text(label)
}
}
}
Ответ
Добавьте ButtonStyle, который меняет scaleEffect по configuration.isPressed и анимирует только это состояние.
struct ShrinkStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.scaleEffect(configuration.isPressed ? 0.5 : 1)
.animation(.easeInOut(duration: 0.2),
value: configuration.isPressed)
}
}
У исходного Button добавьте .buttonStyle(ShrinkStyle()). onTap по-прежнему отвечает только за действие, а стиль — за визуальную реакцию, включая возврат к масштабу 1 после отпускания. Для доступности учитывайте Reduce Motion и не уменьшайте логическую область взаимодействия до неудобного размера. Повторное использование стиля лучше ручного gesture-состояния на каждой кнопке.