效果
.....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
网友评论