I have a UIView
with a UINavigationBar
, a UITabBar
and a UITableView
.
When i press the status bar the UITableView
scrolls to top because i have it set to TRUE
.
I want to be able to do the same, by pressing the UINavigationBar
like it happens in some apps. Setting the UITableView
to scrollsToTop = TRUE
only works if the user presses the StatusBar
.
Method 1:
How about adding a TapGestureRecogniser
on your UINavigationBar
? This will only work if you dont have any buttons on your navigationBar.
//Create a tap gesture with the method to call when tap gesture has been detected
UITapGestureRecognizer* tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(navBarClicked):];
//isolate tap to only the navigation bar
[self.navigationController.navigationBar addGestureRecognizer:tapRecognizer];
//same method name used when setting the tapGesure's selector
-(void)navBarClicked:(UIGestureRecognizer*)recognizer{
//add code to scroll your tableView to the top.
}
and that's about it really.
Some people have found that their back button stops working when adding a tap gesture to the navigation bar, so you can do one of two things:
UIGestureRecognizerDelegate
method called gestureRecognizer:shouldReceiveTouch
and make it return NO
when the touch's view is a button, otherwise return YES
. See method 3 in detail.Method 2 from point 1: - feels dirty/hackish
[[self.navigationController.navigationBar.subviews objectAtIndex:1] setUserInteractionEnabled:YES];
[[self.navigationController.navigationBar.subviews objectAtIndex:1] addGestureRecognizer:tapRecognizer];
Method 3 from point 2: - a lot better, the right way
implement the UIGestureRecognizerDelegate
protocol in your .h
file, and in your .m
file add the following:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// Disallow recognition of tap gestures when a navigation Item is tapped
if ((touch.view == backbutton)) {//your back button/left button/whatever buttons you have
return NO;
}
return YES;
}