zoukankan      html  css  js  c++  java
  • iOS7自定义back按钮和pop交互手势

    Clambake for iPhone有一个回退按钮在所有的导航条上.这是一个简单的没有文字箭头.

    实现一个自定义按钮是简单的.类似这个设置controller 的navigationItem一个leftBarButtonItem.

     1 - (void)viewDidLoad
     2 {
     3   self.navigationItem.leftBarButtonItem = [self backButton];
     4 }
     5 
     6 - (UIBarButtonItem *)backButton
     7 {
     8   UIImage *image = [UIImage imageNamed:@"back_button"];
     9   CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height);
    10 
    11   UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame];
    12   [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    13   [button setImage:[UIImage imageNamed:normalImage] forState:UIControlStateNormal];
    14 
    15   UIBarButtonItem *item; = [[UIBarButtonItem alloc] initWithCustomView:button];
    16 
    17   return item;
    18 }

    但是这样在iOS7上 pop手势交互就不好使了.我发现了一个轻松解决的办法.

    通过我的beta测试者,我收到了很多关于pop手势的崩溃日志.

    我发现在栈中推入一个controller后,快速向左平滑,将会引起崩溃.

    换句话说,如果用户在推入还在进行的时候立即去点击返回.那么导航控制器就秀逗了.

    我在调试日志里面发现这些:

    nested pop animation can result in corrupted navigation bar

    经过几个小时的奋斗和尝试,我发现可以缓解这个错误:

    设置手势的delegate为这个导航控制器

    就像Stuart Hall在他的帖子说的那样,分配了一个手势交互行为的委托在自定义按钮显示的时候.然后,当用户快速点击退出的时候,控制器因为手势发送了一个消息在本身已经被销毁的时候.

    我的解决方案是简单的让NavigationController自己成为响应的接受者.最好用一个UINavigationController的子类.

     1 @interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate>
     2 @end
     3 
     4 @implementation CBNavigationController
     5 
     6 - (void)viewDidLoad
     7 {
     8   __weak CBNavigationController *weakSelf = self;
     9 
    10   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    11   {
    12     self.interactivePopGestureRecognizer.delegate = weakSelf;
    13   }
    14 }
    15 
    16 @end

    在转场/过渡的时候禁用 interactivePopGestureRecognizer

    当用户在转场的时候触发一个后退手势,则各种事件又凑一块了.导航栈内又成了混乱的.我的解决办法是,转场效果的过程中禁用手势识别,当新的视图控制器加载完成后再启用.再次建议使用UINavigationController的子类操作.

     1 @interface CBNavigationController : UINavigationController <UINavigationControllerDelegate, UIGestureRecognizerDelegate>
     2 @end
     3 
     4 @implementation CBNavigationController
     5 
     6 - (void)viewDidLoad
     7 {
     8   __weak CBNavigationController *weakSelf = self;
     9 
    10   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    11   {
    12     self.interactivePopGestureRecognizer.delegate = weakSelf;
    13     self.delegate = weakSelf;
    14   }
    15 }
    16 
    17 // Hijack the push method to disable the gesture
    18 
    19 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    20 {
    21   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    22     self.interactivePopGestureRecognizer.enabled = NO;
    23 
    24   [super pushViewController:viewController animated:animated];
    25 }
    26 
    27 #pragma mark UINavigationControllerDelegate
    28 
    29 - (void)navigationController:(UINavigationController *)navigationController
    30        didShowViewController:(UIViewController *)viewController
    31                     animated:(BOOL)animate
    32 {
    33   // Enable the gesture again once the new controller is shown
    34 
    35   if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    36     self.interactivePopGestureRecognizer.enabled = YES;
    37 }
    38 
    39 
    40 @end
  • 相关阅读:
    图像 resize 代码:保留 aspect ratio(长宽比)
    Pytorch lr_scheduler 中的 last_epoch 用法
    torch.optim用法(参数组的设置)
    课程式学习(Curriculum Learning)
    扇贝单词本-隐藏中文释义 tampermonkey
    电话号码正向标记认证网站申请地址
    考研英语做题计时器网页版(每隔3分钟播放声音,提醒计时)
    mac关闭自动更新后还在每天提醒进行安装更新
    mac 自动生成自签证书脚本
    Ditto
  • 原文地址:https://www.cnblogs.com/yingkong1987/p/3362289.html
Copyright © 2011-2022 走看看