美文网首页iOS学习iOS DeveloperiOS 开发
iOS---悬浮按钮的创建和使用

iOS---悬浮按钮的创建和使用

作者: More_L | 来源:发表于2016-11-25 10:37 被阅读613次

    因为项目中添加这个功能然后研究了一下,记录下供以后回顾

    [参考]http://www.myexception.cn/operating-system/1924022.html

    悬浮按钮的创建和使用

    悬浮按钮

    • 通过UIButton直接创建
    • 通过UIWindow创建按钮

    一. 通过UIButton直接创建

    原理:用到了UIButton 的UIControlEventTouchDragInside 这个属性,在拖动的时候的时候重新设置UIButton的中心的点的位置

    附部分事件:

    UIControlEventTouchDragInside
    当一次触摸在控件窗口内拖动时。
    UIControlEventTouchDragOutside
    当一次触摸在控件窗口之外拖动时。
    UIControlEventTouchDragEnter
    当一次触摸从控件窗口之外拖动到内部时。
    UIControlEventTouchDragExit
    当一次触摸从控件窗口内部拖动到外部时。
    UIControlEventTouchUpInside
    所有在控件之内触摸抬起事件。

    部分代码:

    [self.btn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
    
    - (void) dragMoving: (UIButton *) c withEvent:ev
    {
        self.a=1;
        c.center = [[[ev allTouches] anyObject] locationInView:self.view];
    }
    

    二. 通过UIWindow创建按钮

    原理:通过创建一个新的UIWindow,在顶上添加重写之后的UIButton在重写的UIButton里面设置各种的便宜量保证按钮能够依附边界。因为默认的情况下只能存在一个Window我们还需要设置windowLevel。

    部分代码:

    // 开始触摸,记录触点位置用于判断是拖动还是点击
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
     {
        UITouch *touch = [touches anyObject];
        _startPos = [touch locationInView:_rootView];
    }
    
     手指按住移动过程,通过悬浮按钮的拖动事件来拖动整个悬浮窗口
     */
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // 获得触摸在根视图中的坐标
        UITouch *touch = [touches anyObject];
        CGPoint curPoint = [touch locationInView:_rootView];
        // 移动按钮到当前触摸位置
        self.superview.center = curPoint;
    }
    
    拖动结束后使悬浮窗口吸附在最近的屏幕边缘
     
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        // 获得触摸在根视图中的坐标
        UITouch *touch = [touches anyObject];
        CGPoint curPoint = [touch locationInView:_rootView];
    switch (minDir) {
            case LEFT:
            {
                [UIView animateWithDuration:0.3 animations:^{
                    self.superview.center = CGPointMake(self.superview.frame.size.width/2, self.superview.center.y);
                }];
                break;
            }
            case RIGHT:
            {
                [UIView animateWithDuration:0.3 animations:^{
                    self.superview.center = CGPointMake(ScreenW - self.superview.frame.size.width/2, self.superview.center.y);
                }];
                break;
            }
     }
    

    GitDemo

    相关文章

      网友评论

      • 景天儿:自己试了下代码是可以的,但是有一点不是很明白。
        [self.btn addTarget:self action:@selector(dragMoving:withEvent: )forControlEvents: UIControlEventTouchDragInside];
        为什么UIControlEventTouchDragInside事件,会真的按照- (void) dragMoving: (id) c withEvent:(UIEvent *)ev的参数类型发送呢?

      本文标题:iOS---悬浮按钮的创建和使用

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