I am trying to use the new large title system in iOS 11 using Swift. When the title gets too long (see image example), it adds ... instead of line breaking or shrinking the
This is Objective-C but what I did worked with backButton. I override the setTitle method of UIViewController like this :
-(void)setTitle:(NSString *)title{
[super setTitle:title];
for(id item in self.navigationController.navigationBar.subviews){
if([item isKindOfClass:[UIView class]]){
UIView *lc_view = (UIView *)item;
for(id subItem in lc_view.subviews){
if([subItem isKindOfClass:[UILabel class]]){
UILabel *lc_label = (UILabel *)subItem;
lc_label.text = self.title;
lc_label.numberOfLines=0;
lc_label.lineBreakMode = NSLineBreakByWordWrapping;
}
}
}
}
[self.navigationController.navigationBar layoutSubviews];
[self.navigationController.navigationBar layoutIfNeeded];
}
Then where I want to set the title I simply did :
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.02 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.title=@"Lorem ipsum dolor sit amet, consectetuer adipiscing elit.";
});
In my case (changing title in UIPageViewController didFinishAnimating method) it seems that a delay < 0.02 didn't work.
Try this:
for navItem in (self.navigationController?.navigationBar.subviews)! {
for itemSubView in navItem.subviews {
if let largeLabel = itemSubView as? UILabel {
largeLabel.text = self.title
largeLabel.numberOfLines = 0
largeLabel.lineBreakMode = .byWordWrapping
}
}
}
It worked for me.