ios中创建可以拖动的view原理和实现详解(含代码)

有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件。

重点是以下一组方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event     // 触摸事件结束,如果你需要自动把view停靠到一个位置,实现这个方法

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event  //外界因素取消touch事件等,如进入电话,进行特别处理

对于最上面两个方法是必须实现的,后面两个方法是用来做一些额外的需求或者处理使用,如果只是要实现拖动view可以不实现。

思路1: 创建一个uiview(或者你需要的控件)的子类,在类中实现上述的方法。

思路2:在你相应的viewcontroller中实现上述方法(在viewcontroller中持有你要拖动的view,这样才能控制它),也能实现类似的目的,但这样触摸的范围就会是整个viewcontroller的view,你需要在touchesBegan进行相应的判断(从UITouch中可以得到view的相关信息),才能实现固定在小窗口内部的触摸。

两种思路都是可行的,根据你实际情况去做选择,都没有问题。

以下是代码(子类方式的简单实现,你也可以进行相应修改放到viewcontroller中):

@interface TouchEaglView()

@property (assign, nonatomic) CGPoint beginpoint;

@end

@implementation TouchEaglView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [touches anyObject];

self.beginpoint = [touch locationInView:self];

[super touchesBegan:touches withEvent:event];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [touches anyObject];

CGPoint currentLocation = [touch locationInView:self];

CGRect frame = self.frame;

frame.origin.x += currentLocation.x - self.beginpoint.x;

frame.origin.y += currentLocation.y - self.beginpoint.y;

self.frame = frame;

}

上面的代码存在一个问题,那就是他的触摸移动范围包括了屏幕之外,你会发现你可以把view部分拖动到屏幕外部。那么我们需要一个高级一些的实现:

注:这个版本是基于viewcontroller的实现,并未子类化view;self.localview是你持有的小窗口,beginpoint需要你在viewcontroller中自己定义

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

if (!self.isInView)    // 仅当取到touch的view是小窗口时,我们才响应触控,否则直接return

{

return;

}

UITouch *touch = [touches anyObject];

CGPoint currentPosition = [touch locationInView:self.localView];

//偏移量

float offsetX = currentPosition.x - beginpoint.x;

float offsetY = currentPosition.y - beginpoint.y;

//移动后的中心坐标

self.localView.center = CGPointMake(self.localView.center.x + offsetX, self.localView.center.y + offsetY);

//x轴左右极限坐标

if (self.localView.center.x > (self.localView.superview.frame.size.width-self.localView.frame.size.width/2))

{

CGFloat x = self.localView.superview.frame.size.width-self.localView.frame.size.width/2;

self.localView.center = CGPointMake(x, self.localView.center.y + offsetY);

}

else if (self.localView.center.x < self.localView.frame.size.width/2)

{

CGFloat x = self.localView.frame.size.width/2;

self.localView.center = CGPointMake(x, self.localView.center.y + offsetY);

}

//y轴上下极限坐标

if (self.localView.center.y > (self.localView.superview.frame.size.height-self.localView.frame.size.height/2))

{

CGFloat x = self.localView.center.x;

CGFloat y = self.localView.superview.frame.size.height-self.localView.frame.size.height/2;

self.localView.center = CGPointMake(x, y);

}

else if (self.localView.center.y <= self.localView.frame.size.height/2)

{

CGFloat x = self.localView.center.x;

CGFloat y = self.localView.frame.size.height/2;

self.localView.center = CGPointMake(x, y);

}

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [touches anyObject];

if (touch.view.frame.size.width == 120)   // 120为小窗口的宽度(简单起见这里使用硬编码示例),用来判断触控范围;仅当取到touch的view是小窗口时,我们才响应触控

{

self.isInView = YES;

}

else

{

self.isInView = NO;

}

beginpoint = [touch locationInView:self.localView];

[super touchesBegan:touches withEvent:event];

}

ios中创建可以拖动的view原理和实现详解(含代码),码迷,mamicode.com

时间: 2024-08-04 22:18:48

ios中创建可以拖动的view原理和实现详解(含代码)的相关文章

ios中创建可以拖动的view原理和实现详解

有时候我们会需要在界面上拖动view;uiview是继承于uiresponder的,所以可以响应触摸相关的事件. 重点是以下一组方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesEnded:(NSSet *)touches withEvent:(UIE

IOS中复制对象的用法及深拷贝和浅拷贝详解

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr

iOS中 扫描二维码/生成二维码详解 韩俊强的博客

最近大家总是问我有没有关于二维码的demo,为了满足大家的需求,特此研究了一番,希望能帮到大家! 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 指示根视图: self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[SecondViewController new]]; 每日更新关注:http://weibo.com/hanjunqi

iOS中 视频直播功能-流媒体的使用(详解)韩俊强的CSDN博客

上一篇博客:(流媒体实现视频播放和下载功能):http://blog.csdn.net/qq_31810357/article/details/50574914 最近视频直播功能比较火,处于需求,研究了一番,根据分析决定使用流媒体实现,代码简单易懂,接下来看教程: 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 简单介绍: HLS 协议 : >5M会被AppStore拒绝  服务器要求低   延迟高    多平台 RTMP 协议:  电视直播   PC端使用

iOS中nil 、NULL、 Nil 、NSNull的详解(一)

1.nil >Defines the id of a null instance. 定义一个实例为空, 指向oc中对象的空指针. >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; if (anotherObject == nil) // do something >当对某个对象release 的同时最好把他们赋值为nil,这样可以确保安全性,如果不赋值nil,可能导致程序崩溃.   

ios中创建控制器的几种方式

1.通过storyboard创建: (1)先加载storyboard文件: UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Test"  bundle:nil]; (2) 初始化storyboard中的控制器: ①初始化"初始控制器":HLViewController * hl = [storyboard instantiateInitialViewController]; ②通过标识初始

Android中自定义View、ViewGroup理论基础详解

Android自身提供了许多widgets,但是有时候这些widgets并不能满足我们的需求,这时我们就需要自定义View,本文会详细说明自定义View的各种理论基础,只有理解了这些知识,我们才能更好地实现各种功能的控件. 我觉得自定义View中最重要的部分就是绘图和交互,自定义的绘图使得你的View与众不同,交互使用户可以与你的View进行交互,而绘图的前提是View的量算与布局,交互的基础是触摸事件,所以量算.布局.绘图.触摸事件这些是自定义View的核心. 除此之外,一个设计友好的自定义V

iOS回顾笔记(04) -- UIScrollView的基本使用详解

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp] view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDelegate> { UITe