华山论剑之iOS的解决"UIScrollView不能响

作者: 神经骚栋 | 来源:发表于2016-07-02 23:21 被阅读630次

    信念和目标,必须永远洋溢在程序员内心。

    问题的实例


    前两天在做注册界面的时候(类似于下图),由于注册的条件过多,所以像5s等根本就不放下去,那么解决的方案就出现了两种,一种就是使用tableView的形式做注册页面,另外一种方式就是用UIscrollView做一个滑动视图,然后上面添加各种输入框,我选择的是第二种(看起来麻烦,其实处理起来差不多,这个问题我会在后面的博客做详解),既然是注册,那么必不可少的就是输入框UITextField了,当我们输入完成的时候,我们想要取消第一响应者,我们实现了- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 这个方法,但是程序根本不取消对应UITextField的第一响应者..

    注册页面

    问题的原因


    原因很简单,UIView的touch事件被UIScrollView捕获了,UIView获取不到touch事件,自然不能取现对应的UITextField的第一响应者了.

    问题的解决方案


    既然我们知道了UIView的touch事件被UIScrollView捕获了 ,只要让让UIScrollView将事件传递过去就可以了。最简单的解决办法就是加一个UIScrollView的category。这样每个用到UIScrollView的地方只要导入这个category就可以直接响应相关的touch事件了。 我们看一下category(延展)当中我们改如何重写touch相关的方法.

    #import "UIScrollView+UITouch.h"
    @implementation UIScrollView (UITouch)
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [[self nextResponder] touchesBegan:touches withEvent:event]; 
    [super touchesBegan:touches withEvent:event];
    }
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
     [[self nextResponder] touchesMoved:touches withEvent:event]; 
    [super touchesMoved:touches withEvent:event];
    }
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [[self nextResponder] touchesEnded:touches withEvent:event];
     [super touchesEnded:touches withEvent:event];
    }
    
    @end
    
    本博客相关的Demo没有做,如果有任何疑问,请在下面评论区写上您的问题,我会及时的回复您.谢谢.

    相关文章

      网友评论

      • PGOne爱吃饺子:你好 大佬,你的这个scrollview捕获手势的,可以问一个问题么,你文中说的那个 “UIView的touch事件被UIScrollView捕获了”,view是指的哪个view啊
        PGOne爱吃饺子:你好 ,我写了一个demo,测试了一下,发现scollview的父级View的touchesBegan是走的的,并没有scrollview捕获手势这个现象啊,请问一下,是什么原因
        神经骚栋:@PGOne爱吃饺子 你好 这个是scollview的父级View
      • 笨鸟后飞了:加个tap手势是不是简单点
        神经骚栋:@海东 可以的,解决的方案本来就是多种多样~~~ :smile:
      • __夏至未至:可以直接给scrollview添加个tap手势 然后resignfirstresponse或者直接end edit?
        神经骚栋:@__夏至未至 可以~

      本文标题:华山论剑之iOS的解决"UIScrollView不能响

      本文链接:https://www.haomeiwen.com/subject/vvbxjttx.html