美文网首页
OC 实现UIView 四个角 独立 拖动

OC 实现UIView 四个角 独立 拖动

作者: 三少爷_贱 | 来源:发表于2023-07-06 18:02 被阅读0次

    效果

    .....gif

    源码

    //
    //  ViewController.m
    //  panDemo
    //
    //  Created by ifun on 2023/7/7.
    //
    
    #import "ViewController.h"
    
    typedef NS_ENUM(NSUInteger, mainViewBtnType) {
        mainViewBtnTypeNone = 0,
        mainViewBtnTypeLeftUp,
        mainViewBtnTypeRightUp,
        mainViewBtnTypeLeftDown,
        mainViewBtnTypeRightDown,
        mainViewBtnTypeCenter
    };
    
    @interface ViewController ()
    
    @property(nonatomic,strong)UIView *mainView;
    
    @property(nonatomic,strong)UIButton *submitBtn;
    
    
    @property(nonatomic,assign)CGPoint startedPoint;
    
    @property(nonatomic,assign)CGRect mainViewStartedFrame;
    
    @property(nonatomic,assign)mainViewBtnType btnType;
    
    @property(nonatomic,strong)NSLayoutConstraint *layoutConstraint_left;
    
    @property(nonatomic,strong)NSLayoutConstraint *layoutConstraint_width;
    
    @property(nonatomic,strong)NSLayoutConstraint *layoutConstraint_top;
    
    @property(nonatomic,strong)NSLayoutConstraint *layoutConstraint_height;
    
    @property(nonatomic,assign)CGFloat minWidth;//最小宽高
    
    @property(nonatomic,assign)CGFloat minHeight;
    
    @property(nonatomic,assign)CGFloat tocuhDia;//四个角的触摸直径,除了4个角,其余都是中间的触摸事件
    
    @property(nonatomic,strong)UIView *lastTopLine;
    
    @property(nonatomic,strong)UIView *lastDownLine;
    
    @property(nonatomic,strong)UIView *lastLeftLine;
    
    @property(nonatomic,strong)UIView *lastRightLine;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor grayColor];
        self.minWidth =
        self.minHeight = CGRectGetWidth(self.view.frame)/3;
        
        self.tocuhDia = self.minWidth/3;
        
        [self mainView];
        [self submitBtn];
        
        // Do any additional setup after loading the view.
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"touchesBegan touches.count:%lu",(unsigned long)touches.count);
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch locationInView:self.view];
        self.startedPoint = point;
        self.mainViewStartedFrame = self.mainView.frame;
        
        if (CGRectContainsPoint(self.mainView.frame, point)){
            CGPoint pointFingerInView = [touch locationInView:self.mainView];
            if(CGRectContainsPoint(CGRectMake(0, 0, self.tocuhDia, self.tocuhDia), pointFingerInView)){
                self.btnType = mainViewBtnTypeLeftUp;
            }else if (CGRectContainsPoint(CGRectMake(self.mainView.frame.size.width - self.tocuhDia, 0, self.tocuhDia, self.tocuhDia), pointFingerInView)){
                self.btnType = mainViewBtnTypeRightUp;
            }else if (CGRectContainsPoint(CGRectMake(0, self.mainView.frame.size.height - self.tocuhDia, self.tocuhDia, self.tocuhDia), pointFingerInView)){
                self.btnType = mainViewBtnTypeLeftDown;
            }else if (CGRectContainsPoint(CGRectMake(self.mainView.frame.size.width - self.tocuhDia, self.mainView.frame.size.height - self.tocuhDia, self.tocuhDia, self.tocuhDia), pointFingerInView)){
                self.btnType = mainViewBtnTypeRightDown;
            }else{
                self.btnType = mainViewBtnTypeCenter;
            }
        }
    }
    
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSLog(@"touchesMoved touches.count:%lu",(unsigned long)touches.count);
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch locationInView:self.view];
        
        CGFloat movedWidth = point.x - self.startedPoint.x;
        CGFloat movedHeight = point.y - self.startedPoint.y;
        NSLog(@"btnType:%lu ==>movedWidth:%.4f@===>movedHeight:%.4f",(unsigned long)self.btnType,movedWidth,movedHeight);
        switch (self.btnType) {
            case mainViewBtnTypeNone:break;
            case mainViewBtnTypeLeftUp:{
                self.mainView.frame = CGRectMake(MIN(MAX(CGRectGetMinX(self.mainViewStartedFrame) + movedWidth, 0), CGRectGetMaxX(self.mainViewStartedFrame) - self.minWidth),
                                                 MIN(MAX(CGRectGetMinY(self.mainViewStartedFrame) + movedHeight, 0), CGRectGetMaxY(self.mainViewStartedFrame)- self.minHeight),
                                                 MAX(CGRectGetWidth(self.mainViewStartedFrame) - movedWidth, self.minWidth),
                                                 MAX(CGRectGetHeight(self.mainViewStartedFrame) - movedHeight, self.minHeight));
            }break;
            case mainViewBtnTypeRightUp:{
                self.mainView.frame = CGRectMake(CGRectGetMinX(self.mainViewStartedFrame),
                                                 MIN(MAX(CGRectGetMinY(self.mainViewStartedFrame) + movedHeight, 0), CGRectGetMaxY(self.mainViewStartedFrame)- self.minHeight),
                                                 MAX(CGRectGetWidth(self.mainViewStartedFrame) + movedWidth, self.minWidth),
                                                 MAX(CGRectGetHeight(self.mainViewStartedFrame) - movedHeight, self.minHeight));
            }break;
            case mainViewBtnTypeLeftDown:{
                self.mainView.frame = CGRectMake(MIN(MAX(CGRectGetMinX(self.mainViewStartedFrame) + movedWidth, 0), CGRectGetMaxX(self.mainViewStartedFrame) - self.minWidth),
                                                 CGRectGetMinY(self.mainViewStartedFrame),
                                                 MAX(CGRectGetWidth(self.mainViewStartedFrame) - movedWidth, self.minWidth),
                                                 MAX(CGRectGetHeight(self.mainViewStartedFrame) + movedHeight, self.minHeight));
            }break;
            case mainViewBtnTypeRightDown:{
                self.mainView.frame = CGRectMake(CGRectGetMinX(self.mainViewStartedFrame),
                                                 CGRectGetMinY(self.mainViewStartedFrame),
                                                 MIN(MAX(CGRectGetWidth(self.mainViewStartedFrame) + movedWidth, self.minWidth), CGRectGetWidth(self.view.frame) - CGRectGetMinX(self.mainView.frame)),
                                                 MIN(MAX(CGRectGetHeight(self.mainViewStartedFrame) + movedHeight, self.minHeight), CGRectGetHeight(self.view.frame) - CGRectGetMinY(self.mainView.frame)));
            }break;
            case mainViewBtnTypeCenter:{
                self.mainView.frame = CGRectMake(MIN(MAX(CGRectGetMinX(self.mainViewStartedFrame) + movedWidth, 0), CGRectGetWidth(self.view.frame) - CGRectGetWidth(self.mainViewStartedFrame)) ,
                                                 MIN(MAX(CGRectGetMinY(self.mainViewStartedFrame) + movedHeight, 0), CGRectGetHeight(self.view.frame) - CGRectGetHeight(self.mainViewStartedFrame)) ,
                                                 CGRectGetWidth(self.mainViewStartedFrame),
                                                 CGRectGetHeight(self.mainViewStartedFrame));
            }break;
            default:
                break;
        }
    }
    
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        self.btnType = mainViewBtnTypeNone;
    }
    
    - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        self.btnType = mainViewBtnTypeNone;
    }
    
    -(UIView *)mainView{
        if(!_mainView){
            _mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.minWidth, self.minHeight)];
            _mainView.backgroundColor = [UIColor blackColor];
            _mainView.center = self.view.center;
            [self.view addSubview:_mainView];
        }
        return _mainView;
    }
    
    -(UIButton *)submitBtn{
        if(!_submitBtn){
            _submitBtn = [[UIButton alloc] initWithFrame:CGRectMake(40, 40, 50, 30)];
            _submitBtn.backgroundColor = [UIColor blueColor];
            [_submitBtn addTarget:self action:@selector(showLine) forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:_submitBtn];
        }
        return _submitBtn;
    }
    
    -(void)showLine{
        //画顶部的线条
        [self showTopLine];
        //画左边的线条
        [self showLeftLine];
        //画右边的线条
        [self showRightLine];
        //画下边的线条
        [self showDownLine];
    }
    
    -(void)showTopLine{
        if(self.lastTopLine == nil){
            UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMinY(self.mainView.frame) , self.view.frame.size.width, 1)];
            line.backgroundColor = [UIColor redColor];
            [self.view addSubview:line];
            self.lastTopLine = line;
            [self showTopLine];
        }else{
            if((CGRectGetMinY(self.lastTopLine.frame) - self.mainView.frame.size.height ) > 0){
                UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, (CGRectGetMinY(self.lastTopLine.frame) - self.mainView.frame.size.height) , self.view.frame.size.width, 1)];
                line.backgroundColor = [UIColor redColor];
                [self.view addSubview:line];
                self.lastTopLine = line;
                [self showTopLine];
            }else{
                self.lastTopLine = nil;
            }
        }
    }
    
    -(void)showLeftLine{
        if(self.lastLeftLine == nil){
            UIView *line = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMinX(self.mainView.frame),0, 1, self.view.frame.size.height)];
            line.backgroundColor = [UIColor redColor];
            [self.view addSubview:line];
            self.lastLeftLine = line;
            [self showLeftLine];
        }else{
            if((CGRectGetMinX(self.lastLeftLine.frame) - self.mainView.frame.size.width ) > 0){
                UIView *line = [[UIView alloc] initWithFrame:CGRectMake((CGRectGetMinX(self.lastLeftLine.frame) - self.mainView.frame.size.width),0 , 1, self.view.frame.size.height)];
                line.backgroundColor = [UIColor redColor];
                [self.view addSubview:line];
                self.lastLeftLine = line;
                [self showLeftLine];
            }else{
                self.lastLeftLine = nil;
            }
        }
    }
    
    -(void)showRightLine{
        if(self.lastRightLine == nil){
            UIView *line = [[UIView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.mainView.frame),0, 1,self.view.frame.size.height)];
            line.backgroundColor = [UIColor redColor];
            [self.view addSubview:line];
            self.lastRightLine = line;
            [self showRightLine];
        }else{
            if((CGRectGetMaxX(self.lastRightLine.frame) + self.mainView.frame.size.width ) < self.view.frame.size.width){
                UIView *line = [[UIView alloc] initWithFrame:CGRectMake((CGRectGetMaxX(self.lastRightLine.frame) + self.mainView.frame.size.width ),0, 1,self.view.frame.size.height)];
                line.backgroundColor = [UIColor redColor];
                [self.view addSubview:line];
                self.lastRightLine = line;
                [self showRightLine];
            }else{
                self.lastRightLine = nil;
            }
        }
    }
    
    -(void)showDownLine{
        if(self.lastDownLine == nil){
            UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.mainView.frame) , self.view.frame.size.width, 1)];
            line.backgroundColor = [UIColor redColor];
            [self.view addSubview:line];
            self.lastDownLine = line;
            [self showDownLine];
        }else{
            if((CGRectGetMaxY(self.lastDownLine.frame) + self.mainView.frame.size.height ) < self.view.frame.size.height){
                UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, (CGRectGetMaxY(self.lastDownLine.frame) + self.mainView.frame.size.height ) , self.view.frame.size.width, 1)];
                line.backgroundColor = [UIColor redColor];
                [self.view addSubview:line];
                self.lastDownLine = line;
                [self showDownLine];
            }else{
                self.lastDownLine = nil;
            }
        }
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:OC 实现UIView 四个角 独立 拖动

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