浮动

我这里是基于Masonry布局的

#import "floatView.h"
#import "UIView+Extension.h"
#import "Masonry.h"
@interface floatView ()
@property (nonatomic,strong)UIButton *spButton;
///拖动暂停位置
//@property(nonatomic,assign) CGPoint stopPoint;
///注释
@property(nonatomic,strong)UIView *otherView;
@end

1.创建按钮

- (UIButton *)spButton{
    if (!_spButton) {
        self.spButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [self.spButton setImage:[UIImage imageNamed:@"shijianshangbao"]  forState:UIControlStateNormal];
        self.spButton.frame = CGRectMake([UIScreen mainScreen].bounds.size.width-71,300,66,66);;
        self.spButton.backgroundColor = UIColor.brownColor;
        self.spButton.tag = 0;
        self.spButton.layer.cornerRadius = 8;
        [self addSubview:self.spButton];
    }
    return _spButton;
}

2.给按钮添加手势

-(void)initAddEventBtn{
    [self.spButton addTarget:self action:@selector(addEvent:) forControlEvents:UIControlEventTouchUpInside];
    //添加手势
    UIPanGestureRecognizer *panRcognize=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    [panRcognize setMinimumNumberOfTouches:1];
    [panRcognize setEnabled:YES];
    [panRcognize delaysTouchesEnded];
    [panRcognize cancelsTouchesInView];
    [self.spButton addGestureRecognizer:panRcognize];
}

处理按钮点击处相对于屏幕的位置

- (void)addEvent:(UIButton *)btn{
    btn.selected = !btn.selected;
    UIWindow * window= [[[UIApplication sharedApplication] delegate] window];
    CGRect rect = [btn convertRect: btn.bounds toView:window];
        if (rect.origin.x>SCREEN_WIDTH/2) {
            [self dealOtherViewOnRight:btn];
        }else if (rect.origin.x

浮动按钮在屏幕右边时

- (void)dealOtherViewOnRight:(UIButton *)btn{
    UIWindow * window= [[[UIApplication sharedApplication] delegate] window];
    CGRect rect = [btn convertRect: btn.bounds toView:window];
    if (btn.selected == YES) {
        self.otherView.height = rect.size.height;
        self.otherView.x = rect.origin.x;
        self.otherView.width = 0;
        self.otherView.centerY = btn.centerY;
        [UIView animateWithDuration:0.5 animations:^{
            self.otherView.frame = CGRectMake(rect.origin.x-200, rect.origin.y, 200, rect.size.height);
        }];
    }else{
        [UIView animateWithDuration:0.5 animations:^{
            self.otherView.frame = CGRectMake(rect.origin.x, rect.origin.y, 0, rect.size.height);
        }];
    }
}

浮动按钮在屏幕左边时

- (void)dealOtherViewOnLeft:(UIButton *)btn{
    CGRect rect = btn.frame;
    if (btn.selected == YES) {
        self.otherView.height = rect.size.height;
        self.otherView.x = rect.origin.x+rect.size.width;
        self.otherView.width = 0;
        self.otherView.centerY = btn.centerY;
        [UIView animateWithDuration:0.5 animations:^{
            self.otherView.frame = CGRectMake(rect.origin.x+rect.size.width, rect.origin.y, 200, rect.size.height);
        }];
    }else{
        [UIView animateWithDuration:0.5 animations:^{
            self.otherView.frame = CGRectMake(rect.origin.x+rect.size.width, rect.origin.y, 0, rect.size.height);
        }];
    }
}

重点来了,移动位置的处理

- (void)handlePanGesture:(UIPanGestureRecognizer *)recognizer
{
    //移动状态
    UIGestureRecognizerState recState =  recognizer.state;
    
    switch (recState) {
        case UIGestureRecognizerStateBegan:
            
            break;
        case UIGestureRecognizerStateChanged:
        {
            CGPoint translation = [recognizer translationInView:[self getCurrentVC].navigationController.view];
            recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
        }
            break;
        case UIGestureRecognizerStateEnded:
        {
            CGPoint stopPoint = CGPointMake(0, SCREEN_HEIGHT / 2.0);
            
            if (recognizer.view.center.x < SCREEN_WIDTH / 2.0) {
                if (recognizer.view.center.y <= SCREEN_HEIGHT/2.0) {
                    //左上
                    if (recognizer.view.center.x  >= recognizer.view.center.y) {
                        stopPoint = CGPointMake(recognizer.view.center.x, self.spButton.width/2.0);
                    }else{
                        stopPoint = CGPointMake(self.spButton.width/2.0, recognizer.view.center.y);
                    }
                }else{
                    //左下
                    if (recognizer.view.center.x  >= SCREEN_HEIGHT - recognizer.view.center.y) {
                        stopPoint = CGPointMake(recognizer.view.center.x, SCREEN_HEIGHT - self.spButton.width/2.0);
                    }else{
                        stopPoint = CGPointMake(self.spButton.width/2.0, recognizer.view.center.y);
                    }
                }
            }else{
                if (recognizer.view.center.y <= SCREEN_HEIGHT/2.0) {
                    //右上
                    if (SCREEN_WIDTH - recognizer.view.center.x  >= recognizer.view.center.y) {
                        stopPoint = CGPointMake(recognizer.view.center.x, self.spButton.width/2.0);
                    }else{
                        stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0, recognizer.view.center.y);
                    }
                }else{
                    //右下
                    if (SCREEN_WIDTH - recognizer.view.center.x  >= SCREEN_HEIGHT - recognizer.view.center.y) {
                        stopPoint = CGPointMake(recognizer.view.center.x, SCREEN_HEIGHT - self.spButton.width/2.0);
                    }else{
                        stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0,recognizer.view.center.y);
                    }
                }
            }
            
            //如果按钮超出屏幕边缘
            if (stopPoint.y + self.spButton.width+40>= SCREEN_HEIGHT) {
                stopPoint = CGPointMake(stopPoint.x, SCREEN_HEIGHT - self.spButton.width/2.0-49);
                NSLog(@"超出屏幕下方了!!"); //这里注意iphoneX的适配。。X的SCREEN高度算法有变化。
            }
            if (stopPoint.x - self.spButton.width/2.0 <= 0) {
                stopPoint = CGPointMake(self.spButton.width/2.0+5, stopPoint.y);
                NSLog(@"超出屏幕左边了!!");
            }
            if (stopPoint.x + self.spButton.width/2.0 >= SCREEN_WIDTH) {
//                break;
                stopPoint = CGPointMake(SCREEN_WIDTH - self.spButton.width/2.0-5, stopPoint.y);
                NSLog(@"超出屏幕右边了!!");
            }
            if (stopPoint.y - self.spButton.width/2.0 <= 0) {
                stopPoint = CGPointMake(stopPoint.x, self.spButton.width/2.0);
            }
            [UIView animateWithDuration:0.5 animations:^{
                recognizer.view.center = stopPoint;
            }];
        }
            break;
            
        default:
            break;
    }
    
    [recognizer setTranslation:CGPointMake(0, 0) inView:self];
}

你可能感兴趣的:(浮动)