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

发布时间 - 2026-01-11 02:10:55    点击率:

本文主要给大家介绍了利用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  # 可以移动悬浮按钮  # 可移动的按钮  # 按钮移动动画  # iOS粒子路径移动效果 iOS实现QQ拖动效果  # ios实现简单随便移动的AR功能  # 相关内容  # 只需  # 给大家  # 很简单  # 这篇文章  # 谢谢大家  # 多说  # 要写  # 就可以  # 有疑问  # crossBtn  # UIButton  # implementation  # property  # void  # CGMutablePathRef  # bottomMargin  # topMargin  # nonatomic  # leftMargin 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何快速搭建FTP站点实现文件共享?  QQ浏览器网页版登录入口 个人中心在线进入  微信h5制作网站有哪些,免费微信H5页面制作工具?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  如何用已有域名快速搭建网站?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  中山网站制作网页,中山新生登记系统登记流程?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  使用spring连接及操作mongodb3.0实例  如何获取免费开源的自助建站系统源码?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  太平洋网站制作公司,网络用语太平洋是什么意思?  如何在宝塔面板中创建新站点?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  iOS验证手机号的正则表达式  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何在阿里云服务器自主搭建网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  网易LOFTER官网链接 老福特网页版登录地址  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  长沙做网站要多少钱,长沙国安网络怎么样?  Python3.6正式版新特性预览  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  高防服务器租用指南:配置选择与快速部署攻略  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  Laravel怎么实现验证码(Captcha)功能  Python高阶函数应用_函数作为参数说明【指导】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  无锡营销型网站制作公司,无锡网选车牌流程?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  高防服务器租用如何选择配置与防御等级?  Laravel模型事件有哪些_Laravel Model Event生命周期详解