iOS 心得十 按钮添加长按手势

前言

今天工作中遇到一个效果,平常我们也是很经常使用的,就是长按一个按钮做一个变换,或者是隐藏显示,或者是变色之类的,方法都是一样的。我采用的长按手势写的,分享出来。

链接

这是 Demo 的链接,和Demo一起看更加的能让你快速的理解。
https://github.com/sunyunfei/UILongPressGestureRecognizer-UIButton.git

代码详解

我是自己定义了一个按钮的类,继承自uibutton。

#import


@interface MyButton :UIButton


@end


#import "MyButton.h"


@implementation MyButton


-(id)init

{

   self = [superinit];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}

/**

 *  代码实例化控件是走的构造方法

 *

 *  @param frame <#frame description#>

 *

 *  @return <#return value description#>

 */

-(id)initWithFrame:(CGRect)frame

{

   self = [superinitWithFrame:frame];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}

/**

 *  nib加载的时候走的控件的加载方法

 *

 *  @param aDecoder <#aDecoder description#>

 *

 *  @return <#return value description#>

 */

-(id)initWithCoder:(NSCoder *)aDecoder

{

   self = [superinitWithCoder:aDecoder];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}

/**

 *  加载手势方法

 */

-(void)loadGesture

{

    //加载一个长按手势

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizeralloc]initWithTarget:self

                                                                                          action:@selector(choose:)];

    longPress.minimumPressDuration = 2;

    [selfaddGestureRecognizer:longPress];


}

/**

 *  手势动作

 */

-(void)choose:(UILongPressGestureRecognizer *)longPress

{

    if(longPress.state ==UIGestureRecognizerStateBegan)

    {

       NSLog(@"111");

       if (self.selected)

        {

            [UIViewanimateWithDuration:0.5 animations:^

             {

                 self.backgroundColor = [UIColoryellowColor];

             }];

           self.selected =NO;

           return;

        }

       else

            [UIViewanimateWithDuration:0.5 animations:^

             {

                 self.backgroundColor = [UIColorblackColor];

                self.selected =YES;

                return ;

             }];

 

    }

   

}

允许多个手势

//- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

//{

//    return YES;

//}

@end


所有的重点就在这一个自定义按钮的.m文件里面。首先说一下,我选择去自定义按钮而不是直接选择在工程创建了按钮之后在view上操作不是说这样写代码有多简单,如果是几个类的程序这倒无所谓,但是当你的项目有几十个甚至上百个.m文件的时候,你就很有必要自定义控件的类的,不然你很难去管理修改你以前做的操作。

-(id)init

{

   self = [superinit];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}

/**

 *  代码实例化控件是走的构造方法

 *

 *  @param frame <#frame description#>

 *

 *  @return <#return value description#>

 */

-(id)initWithFrame:(CGRect)frame

{

   self = [superinitWithFrame:frame];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}

/**

 *  nib加载的时候走的控件的加载方法

 *

 *  @param aDecoder <#aDecoder description#>

 *

 *  @return <#return value description#>

 */

-(id)initWithCoder:(NSCoder *)aDecoder

{

   self = [superinitWithCoder:aDecoder];

   if (self)

    {

        [selfloadGesture];

    }

    return self;

}


这三个方法,我其实已经标注了,是为了满足不论你是代码创建还是nib创建都会走你想要走的方法。不然这个自定的类就会有缺陷。里面加载的就是长按手势的方法,这个大家应该知道。

/**

 *  加载手势方法

 */

-(void)loadGesture

{

    //加载一个长按手势

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizeralloc]initWithTarget:self

                                                                                          action:@selector(choose:)];

    longPress.minimumPressDuration = 2;

    [selfaddGestureRecognizer:longPress];


}

这个方法就是长按手势之后执行的动作。刚开始我是直接在里面写我需要的效果。没有判断最外层的长按开始这个判断,然后我一执行,发现有问题,这个方法会走两次,没错,你没有看错,是走两次。长按手势的事件会在你开始长按的时候走一次,然后还会在你松开的时候走一次。所以,孩纸,效果不行,然后忽然想到拖拽手势有拖拽开始,拖拽中,拖拽结束这几个动作,长按有吗?经过测试,是有的,所以在效果外面加一次判断是长按开始进行你想要的效果。

允许多个手势

//- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

//{

//    return YES;

//}

这一个方法大家也看到了,被我注释掉了。因为大家都知道其实按钮说白了也是被苹果封装了,里面封装的点击手势

UITapGestureRecognizer,一个控件默认只会响应一个手势。那么既然本身已经有点击手势了,如果再响应其他的手势就要更改按钮的默认响应一个手势。用这个方法打开返回Yes,让按钮可以响应多手势。但是我把他关了也是可以运行,那么应该是苹果很贴心的在按钮里面已经集成了这个方法。

结束

至此,无论是你代码创建的按钮,还是nib创建的按钮,把类型定义为MyButton类型,直接使用就行了。

运行中,你会发现按钮颜色改变的过程中显示按钮字体那一块会有个蓝色的背景块,考考你,自己解决了。实在不会了,再给你说吧。


忘了说了,我的xcode是7.1版本,如果是7.0之下的版本应该报错的。这个不要说我坑,用这么高版本,每个版本都有自身的优点。科技总会更新,不可能一直守着6.4万年不走。不要听别人说7.0之上多坑之类的,无论什么,你不进步,在这个进步的社会就是后退了。

你可能感兴趣的:(ios开发)