iOS实现一个可以在屏幕中自由移动的按钮

 更新时间:2017年07月04日 17:00:47   作者:大炮打小鸟  
经常在手机上看到可以随意移动的按钮,正巧最近工作遇到了这个需求,索性就写一个,下面这篇文章主要给大家介绍了利用iOS实现一个可以在屏幕中自由移动的按钮的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

本文主要给大家介绍了利用iOS实现一个可以在屏幕中自由移动的按钮的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍。

效果图如下:

其实实现很简单,只需要写.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

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位iOS开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • iOS开发实现下载器的基本功能(1)

    iOS开发实现下载器的基本功能(1)

    这篇文章主要为大家详细介绍了iOS开发实现下载器基本功能的相关资料,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • iOS13 适配和Xcode11.0踩坑小结

    iOS13 适配和Xcode11.0踩坑小结

    这篇文章主要介绍了iOS13 适配和Xcode11.0踩坑小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 详解Swift 利用Opration和OprationQueue来下载网络图片

    详解Swift 利用Opration和OprationQueue来下载网络图片

    这篇文章主要介绍了详解Swift 利用Opration和OprationQueue来下载网络图片的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • IOS 实现微信自动抢红包(非越狱IPhone)

    IOS 实现微信自动抢红包(非越狱IPhone)

    这篇文章主要介绍了IOS 实现微信自动抢红包(非越狱IPhone)的相关资料,这里对实现自动抢红包做一个详细的实现步骤,需要的朋友可以参考下
    2016-11-11
  • iOS NSURLSessionDownloadTask设置代理文件下载的示例

    iOS NSURLSessionDownloadTask设置代理文件下载的示例

    本篇文章主要介绍了iOS NSURLSessionDownloadTask设置代理文件下载的示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • iOS小数取整的方法(ceil floor round)示例

    iOS小数取整的方法(ceil floor round)示例

    这篇文章主要为大家介绍了iOS小数取整的方法(ceil floor round)示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • iOS swift实现转场动画的方法示例

    iOS swift实现转场动画的方法示例

    在平时的iOS开发中,我们进行界面跳转时一般都是采用系统默认的转场动画,而下面这篇文章主要给大家介绍了关于iOS利用swift实现转场动画的方法示例,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • iOS MRC 下 block 循环引用问题实例讲解

    iOS MRC 下 block 循环引用问题实例讲解

    本文通过文字说明加代码的形式给大家介绍了iOS MRC 下 block 循环引用问题,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • iOS 防止按钮多次点击造成多次响应的方法

    iOS 防止按钮多次点击造成多次响应的方法

    这篇文章主要介绍了iOS 防止按钮多次点击造成多次响应的方法的相关资料,这里对多次点击造成的响应提供了解决办法,需要的朋友可以参考下
    2016-11-11
  • 详解IOS 单例的两种方式

    详解IOS 单例的两种方式

    这篇文章主要介绍了详解IOS 单例的两种方式的相关资料,希望通过本文大家能够理解掌握IOS 的两种单例的使用方法,需要的朋友可以参考下
    2017-09-09

最新评论