В iOS 7 мои названия UIButton оживляются и выходят не в то время - поздно. Эта проблема не появляется на iOS 6. Я просто использую:
[self setTitle:text forState:UIControlStateNormal];
Я бы предпочел, чтобы это произошло мгновенно и без пустой рамки. Это мерцание особенно отвлекает и отвлекает внимание от других анимаций.
self.button.titleLabel.text = text
. Но это не меняет размер рамки метки и не работает с UIControlStates правильноОтветы:
Это работает для пользовательских кнопок:
Для системных кнопок вам нужно добавить это перед повторным включением анимации (спасибо @Klaas):
источник
[_button layoutIfNeeded];
Используйте
performWithoutAnimation:
метод, а затем принудительно создайте макет, а не позже.источник
[button layoutIfNeeded];
внутри блока.Измените тип кнопки на пользовательский конструктор интерфейса формы.
Это сработало для меня.
источник
В Swift вы можете использовать:
источник
layoutIfNeeded()
кнопка помечается как нуждающаяся в перерисовке, но этого не произойдет до следующего прохода макета, который будет за пределамиperformWithoutAnimation
Пожалуйста, обратите внимание :
когда " buttonType " _button равен "UIButtonTypeSystem" , приведенный ниже код недействителен :
когда « buttonType » _button равен «UIButtonTypeCustom» , приведенный выше код действителен .
источник
Начиная с iOS 7.1, единственным решением, которое работало для меня, была инициализация кнопки с типом
UIButtonTypeCustom
.источник
так что я нашел работающее решение:
сначала мы меняем заголовок для кнопки, затем изменяем размер кнопки для этого заголовка
источник
Установите тип кнопки на UIButtonTypeCustom, и он перестанет мигать
источник
Swift 5
источник
Я сделал расширение Swift для этого:
У меня работает на iOS 8 и 9, с
UIButtonTypeSystem
.(Код для Swift 2, Swift 3 и Objective-C должен быть похожим)
источник
Установите тип UIButton как Custom. Это должно удалить анимацию постепенного появления и исчезновения.
источник
Обычно просто установка типа кнопки на Custom работает для меня, но по другим причинам мне нужно было создать подкласс UIButton и установить тип кнопки обратно на значение по умолчанию (System), чтобы мигающее изображение появилось снова.
настройка
UIView.setAnimationsEnabled(false)
перед изменением названия и затем снова на истину после этого не избежала мигания для меня, независимо от того, звонил яself.layoutIfNeeded()
или нет.Это, и только это в следующем точном порядке, работало для меня с iOS 9 и 10 бета:
1) Создайте подкласс для UIButton (не забудьте также установить собственный класс для кнопки в раскадровке).
2) Переопределите
setTitle:forState:
следующим образом:В Интерфейсном Разработчике вы можете оставить тип кнопки «Система», не нужно менять его на «Пользовательский тип», чтобы этот подход работал.
Надеюсь, это поможет кому-то еще, я так долго боролся с раздражающими мигающими кнопками, что надеюсь избежать этого для других;)
источник
layoutIfNeeded()
:]Вы можете просто создать кнопку Custom, и она прекратит анимацию при изменении заголовка.
Вы также можете сделать это в окне раскадровки: выберите кнопку в раскадровке -> выберите инспектор атрибутов (четвертый слева) -> в раскрывающемся меню «Тип» выберите «Пользовательский» вместо «Система», который, вероятно, был выбран ,
Удачи!
источник
Вы можете удалить анимацию из слоя метки заголовка:
источник
Swift 4 версия ответа Xhacker Лю
источник
UIButton с
system
типом имеет неявную анимациюsetTitle(_:for:)
. Вы можете исправить это двумя разными способами:custom
, либо из кода, либо из Interface Builder:источник
Я обнаружил, что этот обходной путь работает и с UIButtonTypeSystem, но будет работать, только если кнопка включена по какой-то причине.
Так что вам придется добавить их, если вам нужно отключить кнопку при установке ее названия.
(iOS 7, Xcode 5)
источник
[_button setTitle:@"title" forState:UIControlStateDisabled]
Объединение вышеупомянутых великолепных ответов приводит к следующему обходному пути для UIButtonTypeSystem :
источник
У меня возникла проблема с анимацией при смене заголовков кнопок в контроллерах представления в UITabBarController. Названия, которые были первоначально установлены в раскадровке, появлялись на короткое время, прежде чем исчезли в их новых значениях.
Я хотел перебрать все подпредставления и использовать заголовки кнопок в качестве ключей, чтобы получить их локализованные значения с NSLocalizedString, такие как;
Я обнаружил, что анимация вызывает вызов btn.titleLabel.text. Поэтому, чтобы по-прежнему использовать раскадровки и динамически локализовать компоненты, как это, я должен установить для идентификатора восстановления каждой кнопки (в Identity Inspector) тот же заголовок и использовать его в качестве ключа вместо заголовка;
Не идеально, но работает ..
источник
Вы можете установить заголовок вне блока анимации, просто обязательно вызовите
layoutIfNeeded()
внутри executeWithoutAnimation:Если у вас есть несколько кнопок, рассмотрите возможность вызова
layoutIfNeeded()
супер-представления:источник
Расширение Xhacker Liu преобразовано в Swift 3:
источник
Возможно, создание 2 анимаций и 2 кнопок - лучшее решение, чтобы избежать проблемы, возникающей при анимации и изменении текста кнопки?
Я создал второй uibutton и сгенерировал 2 анимации, это решение работает без сбоев.
источник
Я получил его для работы с комбинацией ответов:
источник
Удобное расширение для изменения заголовка анимированной кнопки в Swift, которое прекрасно сочетается с реализацией по умолчанию:
источник
UIButton
.