В новом приложении iOS7 Facebook для iPhone, когда пользователь прокручивает страницу вверх, navigationBar
постепенно скрывается до точки, где оно полностью исчезает. Затем, когда пользователь прокручивает вниз, navigationBar
постепенно появляется.
Как бы вы сами реализовали такое поведение? Мне известно о следующем решении, но оно сразу исчезает и вообще не привязано к скорости жеста прокрутки пользователя.
[navigationController setNavigationBarHidden: YES animated:YES];
Я надеюсь, что это не дубликат, поскольку я не уверен, как лучше всего описать поведение «расширения / сжатия».
ios
iphone
objective-c
ios7
uinavigationbar
Эль Мокосо
источник
источник
Ответы:
Решение, данное @peerless, - отличное начало, но оно запускает анимацию только при начале перетаскивания, без учета скорости прокрутки. Это приводит к более нестабильной работе, чем в приложении Facebook. Чтобы соответствовать поведению Facebook, нам необходимо:
Во-первых, вам понадобится следующее свойство:
А вот
UIScrollViewDelegate
методы:Вам также понадобятся эти вспомогательные методы:
Для немного другого поведения замените строку, которая меняет положение полосы при прокрутке (
else
блок внутриscrollViewDidScroll
), на эту:При этом полоса позиционируется на основе последнего процента прокрутки, а не абсолютного значения, что приводит к более медленному затуханию. Исходное поведение больше похоже на Facebook, но мне тоже нравится это.
Примечание: это решение только для iOS 7+. Обязательно добавьте необходимые проверки, если вы поддерживаете более старые версии iOS.
источник
customView
.ScrollView
«scontentSize
меньше , чем кадр, анимация скольжения не работает. Также убедитесь, что вы сбросили альфа всех элементов навигации обратно на 1,0 дюймаviewDidDisappear
.РЕДАКТИРОВАТЬ: только для iOS 8 и выше.
Вы можете попробовать использовать
Работает для меня.
Если ваше кодирование выполняется быстро, вы должны использовать этот способ (из qaru.site/questions/235 / ... )
источник
Еще одна реализация: выпущен TLYShyNavBar v1.0.0!
Я решил сделать свои собственные после того, как попробовал предоставленные решения, и для меня они либо работали плохо, имели высокий барьер входа и код стандартной пластины, либо не имели представления расширения под панелью навигации. Чтобы использовать этот компонент, все, что вам нужно сделать, это:
Да, и это испытано в боевых условиях в нашем собственном приложении.
источник
extendedLayoutIncludesOpaqueBars
был установленYES
на моемUICollectionViewController
Вы можете взглянуть на мою GTScrollNavigationBar . Я создал подкласс UINavigationBar, чтобы он прокручивался на основе прокрутки UIScrollView.
Примечание. Если у вас НЕПРЕРЫВНАЯ панель навигации, прокрутка должна РАСШИРЯТЬСЯ, поскольку панель навигации СКРЫВАЕТСЯ. Это именно то, что делает GTScrollNavigationBar. (Так же, как, например, в Safari на iOS.)
источник
iOS8 включает в себя свойства, позволяющие бесплатно скрывать панель навигации. Есть видео WWDC, которое демонстрирует это, ищите «Просмотр улучшений контроллера в iOS 8».
Пример :
}
Прочие свойства:
Найдено через http://natashatherobot.com/navigation-bar-interactions-ios8/
источник
У меня есть какое-то быстрое и грязное решение для этого. Не проводил углубленного тестирования, но вот идея:
Это свойство сохранит все элементы на панели навигации для моего класса UITableViewController.
В том же классе UITableViewController у меня есть:
Это только для ios> = 7, я знаю, это ужасно, но это быстрый способ добиться этого. Любые комментарии / предложения приветствуются :)
источник
Это работает для iOS 8 и более поздних версий и гарантирует, что строка состояния по-прежнему сохраняет свой фон.
И если вы хотите, чтобы при нажатии на строку состояния отображалась панель навигации, вы можете сделать это:
источник
Вот моя реализация: SherginScrollableNavigationBar .
В моем подходе я использую
KVO
для наблюденияUIScrollView
за состоянием, поэтому нет необходимости использовать делегат (и вы можете использовать этот делегат для всего, что вам нужно).источник
Пожалуйста, попробуйте это мое решение и дайте мне знать, почему оно не так хорошо, как предыдущие ответы.
источник
Один из способов, которым я добился этого, заключается в следующем.
Зарегистрируйте свой контроллер представления, например, как
UIScrollViewDelegate
вашUITableView
.Из
UIScrollViewDelegate
методов вы можете получить новый contentOffset и соответственно перевести егоUINavigationBar
вверх или вниз.Установка альфа-канала подвидов также может быть выполнена на основе некоторых пороговых значений и факторов, которые вы можете установить и вычислить.
Надеюсь, поможет!
источник
В дополнение к ответу Ивбурка я добавил следующее, чтобы исправить альфа-проблему на ненастроенных панелях навигации и сбросить панель навигации в методе viewWillDisappear:
источник
Я искал решение, допускающее любой стиль и любое поведение. Вы заметите, что во многих приложениях конденсация полосок различается. И, конечно же, панель в разных приложениях выглядит по-разному.
Я создал решение этой проблемы с https://github.com/bryankeller/BLKF flexibleHeightBar/
Вы можете определить свои собственные правила поведения, чтобы контролировать, как и когда полоса сжимается и растет, и вы можете точно определить, как вы хотите, чтобы подвиды полоски реагировали на уплотнение или рост полоски.
Взгляните на мой проект, если вам нужна большая гибкость для создания любой панели заголовка, которую вы можете придумать.
источник
Я пытался подражать этому поведению в ситуации, когда мне требовался настраиваемый заголовок, расположенный около UITableView. Я свернул свою собственную «навигационную» панель, потому что она находится под множеством других вещей на странице, и я хотел, чтобы заголовки разделов соответствовали поведению «стыковки» по умолчанию. Я думаю, что нашел довольно умный и лаконичный способ настроить UITableView / UIScrollView вместе с другим объектом в стиле, аналогичном тому, который мы видели в Facebook / Instagram / Chrome / и т. Д. Программы.
В моем файле .xib мои компоненты загружены в произвольном виде: http://imgur.com/0z9yebJ (извините, у меня нет репутации для встроенных изображений)
Обратите внимание, что на левой боковой панели таблица расположена за основным видом заголовка. Вы не можете сказать по снимку экрана, но он также имеет ту же позицию по оси Y, что и основной вид заголовка. Поскольку он простирается вне поля зрения, свойство contentInset в UITableView установлено на 76 (высота основного представления заголовка).
Чтобы заставить представление основного заголовка скользить вверх вместе с UIScrollView, я использую методы scrollViewDidScroll UIScrollViewDelegate для выполнения некоторых вычислений и изменения contentInset UIScrollView, а также фрейма основного представления заголовка.
Первый оператор if выполняет большую часть тяжелой работы, но мне пришлось включить два других для обработки ситуаций, когда пользователь принудительно перетаскивает, а начальные значения contentOffset, отправленные в scrollViewDidScroll, выходят за пределы диапазона первого оператора if .
В конечном счете, у меня это действительно хорошо работает. Я ненавижу загружать свои проекты кучей раздутых подклассов. Я не могу сказать, является ли это лучшим решением с точки зрения производительности (я всегда не решался помещать какой-либо код в scrollViewDidScroll, поскольку он вызывается все время), но размер кода - самый маленький, который я видел в любом решение этой проблемы, и оно не связано с вложением UITableView в UIScrollView (Apple не советует этого в документации, а события касания в UITableView выглядят немного странно). Надеюсь, это кому-то поможет!
источник
HidingNavigationBar - отличный проект, который,если хотите, скрывает панель навигации и панель вкладок .
https://github.com/tristanhimmelman/HidingNavigationBar
источник
Я попытался реализовать GTScrollNavigationBar, но мое приложение потребовало от меня изменения ограничений автоматического макета. Я решил разместить пример своей реализации на GitHub на тот случай, если кому-то еще придется делать это с помощью автоматического макета. Другая проблема, с которой я столкнулся с большинством других реализаций, заключается в том, что люди не устанавливают границы представления прокрутки, чтобы избежать эффекта прокрутки параллакса, который вы создаете при прокрутке и одновременной настройке размера прокрутки.
Ознакомьтесь с JSCollapsingNavBarViewController, если вам нужно сделать это с помощью автоматического макета. Я включил две версии, одну только с навигационной панелью, а другую с дополнительной панелью под навигационной панелью, которая сворачивается перед тем, как свернуть навигационную панель.
источник
Я пробовал вот так, надеюсь, поможет. просто реализуйте код в методе делегата и установите желаемое представление / подпредставление
источник
Расширение ответа @Iwburk ... Вместо того, чтобы изменять происхождение панели навигации, мне нужно было увеличить / уменьшить размер панели навигации.
Он еще не работает с
stoppedScrolling
методом, я опубликую обновление, когда оно у меня естьисточник
Все эти подходы кажутся слишком сложными ... Естественно, я построил свой собственный:
источник
frame
собственности?Я нашел все ответы, данные в Objective-C. Это мой ответ в Swift 3. Это очень общий код, который можно использовать напрямую. Он работает как с UIScrollView, так и с UITableView.
Логика установки альфы для элементов навигации скопирована из ответа @ WayneBurkett и переписана в Swift 3.
источник
для Swift 4,5 - iOS 11 и выше
Расширение UIView
Вы должны
navigationItem.titleView
применить наборalpha
источник