Отключить анимацию UISwitch - PullRequest
0 голосов
/ 10 января 2019

Мне пришло в голову, что переключатели в приложениях iOS по умолчанию кажутся более быстрыми. Похоже, анимация просто отключена.

Есть ли настройка для изменения этого поведения на UISwitch?

Кажется, это не сработает:

UISwitch.setAnimationsEnabled(enabled: false)

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Мне все еще интересно, почему Apple молча удалила анимации в своих системных приложениях. - нетоматические

Многие области в iOS-приложениях по умолчанию отключают анимацию. UISwitch - кнопка включения / выключения, например,

  • Wi-Fi, персональная точка доступа, в разделе Settings.app

  • Настройка будильника в Clock.app

Здесь сломана анимация кнопки включения / выключения, например

  • Жирный текст (активируйте опцию, затем придет сообщение и нажмите на кнопку отмены) под Settings.app
  • Откройте App Store.app, создайте Apple ID и подтвердите условия использования
  • и еще много других областей ...

На моем iPad 9.7, iPhone 5S и iPhone XS Max с воспроизводимой iOS 12.2. Это ошибки, поскольку iOS 7 и Apple никогда не исправляют это для приложений по умолчанию для iOS.

Многие сторонние приложения принимают на себя одни и те же ошибки, потому что начиная с iOS 7 и до сегодняшнего дня это никогда не исправлялось должным образом. Всегда разработчики должны сами проверять это и исправлять в своих приложениях (или обнаруживать пользователи). Для специальных процессов, например где кнопка включения / выключения принимает на себя многие функции, будет еще хуже. Многие анимации (начиная с iOS 7) не работают.

Примечание !! В iOS 6 (iPhone 5), iOS 5 (iPhone 4S) нет проблем с UISwitch - анимации кнопок включения / выключения (ничего не сломано) в приложениях по умолчанию для iOS. Все сторонние приложения также не имеют этих проблем, которые были разработаны для этой версии iOS в то время.

0 голосов
/ 15 января 2019

Я не думаю, что есть элегантное решение, но я нашел хакерское решение, которое действительно работает.

UISwitch имеет подпредставление, к которому прикреплены 2 распознавателя жестов: один для длительного нажатия и один для панорамирования. Если вы подклассом UISwitch удалите эти распознаватели жестов и добавите новый сразу после инициализации, вы можете добиться неанимированного поведения.

Имейте в виду, что это решение может не работать в будущих версиях iOS, поскольку внутренняя реализация, на которую опирается это решение, может измениться.

Вот фрагмент кода, который работал для меня:

class PTSwitch: UISwitch {

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    let firstSubview = subviews[0]

    guard let gestureRecognizers = firstSubview.gestureRecognizers else {
        return
    }

    for recognizer in gestureRecognizers {
        firstSubview.removeGestureRecognizer(recognizer)
    }

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(gestureRecognized))
    firstSubview.addGestureRecognizer(tapGestureRecognizer)
}

@objc func gestureRecognized() {
    setOn(!isOn, animated: false)
}

}

Как видите, я удалил встроенные средства распознавания жестов и добавил средство распознавания жестов касанием. Вы также можете добавить другой для распознавания жестов панорамирования, он также должен работать. Затем в функции обратного вызова распознавателя жестов я просто использовал функцию setOn из UISwitch с animated: false для отключения анимации.

...