Вы можете попробовать этот взлом:
import timeit
def foo():
print 'bar'
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs\n" % (time,)
import __builtin__
__builtin__.__dict__.update(locals())
dotime()
Нашли решение:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// hide nav bar
[[self navigationController] setNavigationBarHidden:YES animated:YES];
// enable slide-back
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;
}
И в .h файле, соответствуют UIGestureRecognizerDelegate
Если скрытие панели навигации не помогло, попробуйте изменить прямоугольник панели навигации и посмотрите?
navBarBgFrame.origin.y = - navBarBgFrame.size.height;
Протестировано с Swift 2 решение @gabbler, если вы используете
self.navigationController?.navigationBar.hidden = true
Swift 3.0
self.navigationController?.navigationBar.isHidden = true
вместо
self.navigationController?.navigationBarHidden = true
, проведите назад жест работает как очарование!
Swift 4.x и iOS 11.4.
Решение @gabbler все еще работает. ИДК, похоже, что это ошибка UIKit, но ..
Просто используйте:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.navigationBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationController?.navigationBar.isHidden = false
}
Решение Зинан Синс в Swift 4.2 (Пожалуйста, дайте ему голос!):
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: true)
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}
для форм Xamarin я боролся с этим, поэтому сначала не NavigationRenderer, вы получите нулевой NavigationController, вместо этого используйте PageRenderer:
[assembly: Xamarin.Forms.ExportRenderer(typeof(ContentPage), typeof(ContentPageRenderer))]
namespace sample
{
class ContentPageRenderer : PageRenderer
{
public override void ViewWillAppear(bool animated)
{
base.ViewDidAppear(animated);
var navctrl = this.ViewController.NavigationController;
navctrl.InteractivePopGestureRecognizer.Delegate = new UIGestureRecognizerDelegate();
navctrl.InteractivePopGestureRecognizer.Enabled = true;
}
}
}
Обязательно включите:
self.navigationController.navigationBar.hidden = YES;
И:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
И:
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
Оно должно выглядеть так:
- (void)viewWillAppear:(BOOL)animated {
self.navigationController.navigationBar.hidden = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;
}
Используйте
self.navigationController.navigationBar.hidden = YES;
или добавьте эту строку в viewWillAppear:
self.navigationController.interactivePopGestureRecognizer.delegate = self;
Кажется, что взаимодействие не эффективно, добавление этой строки и приведение контроллера представления в соответствие с протоколом UIGestureRecognizerDelegate заставит это работать.