IOS累之用之技术重塑

IOS按钮在屏幕中自由移动

2017-06-28  本文已影响91人  大炮打小鸟
移动的按钮.gif

其实实现很简单,只需要写.m就可以了

#import "CrossBtnVC.h"
@interface CrossBtnVC ()
{
    CGPoint beginPoint;
    CGFloat rightMargin;
    CGFloat leftMargin;
    CGFloat topMargin;
    CGFloat bottomMargin;
    CGMutablePathRef pathRef;
}
@property (nonatomic,strong) UIButton *crossBtn;//聊天移动
@end
@implementation CrossBtnVC
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    _crossBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [_crossBtn setImage:[UIImage imageNamed:@"移动聊天"] forState:UIControlStateNormal];
    _crossBtn.frame = CGRectMake(UI_View_Width-54*UI_Width_Scale, UI_View_Height-103, 40, 40);
    [self.view addSubview:_crossBtn];
    [_crossBtn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];
    [_crossBtn addGestureRecognizer:pan];
    
    rightMargin = [UIScreen mainScreen].bounds.size.width-30;
    leftMargin = 30;
    bottomMargin = [UIScreen mainScreen].bounds.size.height-30-50;
    topMargin = 30+64;

    pathRef=CGPathCreateMutable();
    CGPathMoveToPoint(pathRef, NULL, leftMargin, topMargin);
    CGPathAddLineToPoint(pathRef, NULL, rightMargin, topMargin);
    CGPathAddLineToPoint(pathRef, NULL, rightMargin, bottomMargin);
    CGPathAddLineToPoint(pathRef, NULL, leftMargin, bottomMargin);
    CGPathAddLineToPoint(pathRef, NULL, leftMargin, topMargin);
    CGPathCloseSubpath(pathRef);
}

#pragma mark - 事件
- (void)btnAction:(UIButton*)sender{

}
#pragma mark - 手势
- (void)handlePan:(UIPanGestureRecognizer *)pan
{
    if (pan.state == UIGestureRecognizerStateBegan) {
        
        beginPoint = [pan locationInView:self.view];
    }else if (pan.state == UIGestureRecognizerStateChanged){
        
        CGPoint nowPoint = [pan locationInView:self.view];
        
        float offsetX = nowPoint.x - beginPoint.x;
        float offsetY = nowPoint.y - beginPoint.y;
        CGPoint centerPoint = CGPointMake(beginPoint.x + offsetX, beginPoint.y + offsetY);
        
        if (CGPathContainsPoint(pathRef, NULL, centerPoint, NO))
        {
            _crossBtn.center = centerPoint;
        }else{
            if (centerPoint.y>bottomMargin)
            {
                if (centerPoint.x<rightMargin&&centerPoint.x>leftMargin) {
                    _crossBtn.center = CGPointMake(beginPoint.x + offsetX, bottomMargin);
                }
            }
            else if (centerPoint.y<topMargin)
            {
                if (centerPoint.x<rightMargin&&centerPoint.x>leftMargin) {
                    _crossBtn.center = CGPointMake(beginPoint.x + offsetX, topMargin);
                }
            }
            else if (centerPoint.x>rightMargin)
            {
                _crossBtn.center = CGPointMake(rightMargin, beginPoint.y + offsetY);
            }
            else if (centerPoint.x<leftMargin)
            {
                _crossBtn.center = CGPointMake(leftMargin, beginPoint.y + offsetY);
            }
        }
    }else if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateFailed){
    }
}
@end
上一篇下一篇

猜你喜欢

热点阅读