iOS 11 large title navigation bar snaps instead of smooth transition
I faced same issue - I had UIViewController
embedded in UINavigationController
, the UIViewController
had tableview with leading, trailing, top, bottom constraints to safe area. The whole tableview behaved jumpy / snappy. The trick was to change top constraint of tableview to superview.
Here I recorded changing the constraint
tableview iOS 11 bug constraint change
iOS 11 large navigation bar title unexpected velocity
I have been debugging this for a couple days, and I have found a workaround.
First, What Was Going On?
It is the UIScrollView
that is not performing well with the largeTitle. Since there is scrolling up on the scroll view at the same time as the navigation bar becoming smaller, there exists twice the scrolling compared to the actual scroll.
I confirmed this by intentionally setting:
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
This indeed made it move as desired. But, this couldn't solve the problem entire problem because it did not yield a smooth transition while going from large navigation bar to small navigation bar. You can try the below code out.
if scrollView.contentOffset.y > 0 {
if self.navigationController!.navigationBar.frame.size.height > 44.0 {
scrollView.contentOffset.y = scrollView.contentOffset.y * 0.5
}
}
This worked 'okay' when scrolled slowly, but when you fling downward, it acts slow at first (while navigation height is large), and then speeds up afterwards.
WORKAROUND
Simply put, you CANNOT use UIScrollView
with the iOS 11 large navigation bar. You ought to use UITableViewController
instead.
Since my view is composed of multiple horizontal UICollectionViews
spread along vertically, I used UITableView
with different sections to form the UI using storyboard.
If you use UITableViewController
, it performs as desired.
AppStore and all other Apple-made native apps must do it this way.
Keep TabBar Large Title on swipe swift
The title will collapse on scroll as long as the root view is scrollable, i.e. is a scrollView or a view which embeds a UIScrollView
.
To achieve what you want in the particular case you'd need to add a dummy view ahead of your tableView
in the view hierarchy.
I've found your question while searching how to achieve the opposite /p>
iOS 11 large-title navigation bar not collapsing
Good news! I've just figured out that if I set "Large Titles" to "Never" on the storyboard, and then set it via code, then it works:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
}
Seems like Apple forgot to handle the case when the navigation item has its largeTitleDisplayMode
set via the Interface Builder.
So until they fix this issue, leave "Large Titles" as "Never" on storyboards, and set them via code in viewDidLoad
.
You just need to do that to the first view controller. Subsequent view controllers honor the value in storyboard.
iOS 11 scroll to top when using large titles doesn't work properly
Okay so I found why the problem occurs, but not how to fix it in that exact scenario.
If you're using large titles and a UITableViewController with the navigation bar translucency set to off the problem will occur.
When you turn translucent back on the problem goes away.
If you're using a TableView in a normal UIViewController the problem always occurs.
Edit
Turns out setting "extendedLayoutIncludesOpaqueBars = true" fixes the problem if you're using a translucent navigation bar!
Similar question: UIRefreshControl() in iOS 11 Glitchy effect
How to keep navigation bar title large after pushing view controller from TableView
try this it's working.
In 'HomeViewController'
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
}
In 'DetailViewController'
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.largeTitleDisplayMode = .never
}
Related Topics
Programmatically Disabling Screenshot in App
Why Swift Closure Not Capture Self
Lazy Property Initialization in Swift
Add Skreferencenode/Skscene to Another Skscene in Spritekit
Why Do Integers Not Conform to the Anyobject Protocol
Add Constraints to Generic Parameters in Extension
Print the Nstableview's Row Number of the Row Clicked by the User
How to Request a Desktop Version of a Webpage Using Uiwebview in Swift 3.0
Declaring and Using Custom Attributes in Swift
Swift 2: !, ? -" Value of Optional Type "..." Not Unwrapped"
Swift & Firebase - How to Store More User Data Other Than Email and Password
Is There a Daylight Savings Check in Swift
Extend Generic Array<T> to Adopt Protocol
Show Nsmenu Only on Nsstatusbarbutton Right Click
How to Go from Cmutablepointer<Cgfloat> to Cgfloat[] in Swift
Swift - Reorder Uitableview Cells
Is There a Preferred Technique to Prohibit Pasting into a Uitextfield