Кнопка с анимацией сжатия при нажатии

Добавьте 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-состояния на каждой кнопке.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее