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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

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

    本文主要给大家介绍了利用iOS实现一个可以在屏幕中自由移动的按钮的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍. 效果图如下: 其实实现很简单,只需要写.m就可以了 示例代码 #import "CrossBtnVC.h" @interface CrossBtnVC () { CGPoint beginPoint; CGFloat rightMargin; CGFloat leftMargin; CGFloat topMargin; CGFloat bottomM

  • iOS开发之如何获取视图在屏幕中显示的位置

    前言 相信大家在iOS开发中经常会遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可是,如果按钮是在UITableView的cell上呢?随着UITableView的滚动,按钮可能在顶部,也可能在底部,还可能在中间,左侧.右侧都有可能,那么,这个时候,怎么去计算按钮所在的位置呢?如果按钮所在的UITabelView是在另外一个UIScrollView的一个cell上呢?如果

  • iOS 中根据屏幕宽度自适应分布按钮的实例代码

    下载demo链接:https://github.com/MinLee6/buttonShow.git 屏幕摆放的控件有两种方式,一种根据具体内容变化,一种根据屏幕宽度变化. 下面我分别将两个方式,用代码的方式呈现: 1:根据具体内容变化 // // StyleOneViewController.m // buttonShow // // Created by limin on 15/06/15. // Copyright © 2015年 信诺汇通信息科技(北京)有限公司. All rights

  • IOS 实现一个死锁导致 UI 假死的例子

    IOS 实现一个死锁导致 UI 假死的例子 现象 当 APP 启动一段时间后(约半小时左右),经常会发现 App 界面出现"冻死"的现象.同时后台输出: [CocoaGoPush]WorkThreadProc end 这时 App 呈现"假死"状态,点击屏幕任何地方没有反应,iPhone 除了开屏关屏无任何响应(包括按 Home 键),当然也无法解锁(但可以重启).如果用 Xcode 终止应用程序,则 iPhone 又恢复正常. 注:App 使用了 CocoaGoP

  • iOS实现手动和自动屏幕旋转

    本文实例为大家分享了iOS实现手动和自动屏幕旋转的具体代码,供大家参考,具体内容如下 首先iPhone中屏幕分为状态栏方向和设备方向 typedef NS_ENUM(NSInteger, UIDeviceOrientation) {     UIDeviceOrientationUnknown,     UIDeviceOrientationPortrait,            // Device oriented vertically, home button on the bottom

  • android获得当前view在屏幕中坐标的方法

    本文实例讲述了android获得当前view在屏幕中坐标的方法.分享给大家供大家参考.具体如下: final int[] location = new int[2]; view.getLocationOnScreen(location); 这样就可以得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度) //获取在当前屏幕内的绝对坐标 location[0] x坐标 location[1] y坐标 应用 ,我们可以用来记录上一次listview滚动到了那

  • 浅谈iOS解析HTMl标签以及开发中的一些坑

    开篇 看了看更新日期好久没写简书了,经常还有小伙伴在文章下面评论,看到自己写的东西还是有点用的,鼓励自己接着坚持下去吧,哈哈.今天主要就写写iOS中怎么解析HTML标签,我们常用的后台返回数据一般是json格式的但是有些时候如果我们收到的是带HTMl标签的我们该怎么处理他呢,今天就来说一说吧. 正文 前两天获取后台数据的时候,得到这么一条返回信息 "恭喜您获得<font color='red'>8.1元</font>现金奖励 " 本来简简单单的把返回数据展示到l

  • iOS 生成plist文件,在项目中代码创建plist的实例

    iOS数据存储方式: plist(属性列表),preference(偏好设置),SQLite,coredata plist和preference不支持自定义模型的存储 整理代码创建plist文件的方法: #pragma mark - 创建plist文件 -(void)creatPlistFileWithArr:(NSArray *)array{ //将字典保存到document文件->获取appdocument路径 NSString *docPath = [NSSearchPathForDire

  • 创建一个在标题栏中没有“关闭”按钮的 HTA

    问: 您好,脚本专家!如何创建一个在标题栏中没有"关闭"按钮的 HTA? -- AK 答: 您好,AK.您知道,您的问题让我们陷入了道德和伦理的窘境.毕竟,假如我们给出此问题的答案:这个世界就有可能突然被大量无法关闭的 HTA 所淹没.在我们的眼前会出现这样一幅画面:无法关闭又不能停止的 HTA 疯狂地横扫整个陆地,并吞食沿途的所有系统资源.而我们脚本专家,将要对此负责.我们只是觉得无法在良心上背负这样一条的罪责. 但是,在我们的的良心上再多加一条罪责又会有什么不同呢?明确这一点后,我

  • iOS中长条蓝色按钮(button)实现代码

    一,效果图. 二,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //添加设备 UIButton *deviceButton=[UIButton buttonWithType:UIButtonTypeRoundedRect]; deviceButton.frame=CGRe

随机推荐