iOS开发入门之——拖动视图

原创 2012年03月23日 19:01:44

预备知识

iOS处理屏幕上的触摸动作,主要涉及到以下几个方法:

touchesBegan:withEvent:          //触摸屏幕的最开始被调用

touchesMoved:withEvent:         //移动过程中被调用

touchesEnded:withEvent:         //动作结束时被调用

touchesCancelled:WithEvent:

从方法的命名可以清晰的看出该方法何时被调用,最后一个比较特殊。touchesCancelled:WithEvent:Cocoa Touch必须响应持续触摸事件的系统中断时调用。

我们只要重写这些方法,来作我们想要作的事情就可以了。


如何实现拖动视图?

1.设置userInteractionEnabled属性为YES,允许用户交互。
2.在触摸动作开始时记录起始点。
3.在移动过程中,计算当前位置坐标与起始点的差值,即偏移量,并且移动视图中心点至偏移量大小的地方。
4.分别限制x坐标、与y坐标,保证用户不可将视图托出屏幕

备注:分别限制x坐标与y坐标的原因是,即使向右拖动不了了,仍需保证可以向下拖动。


实现代码

以子类化UIImageView为例

#import <UIKit/UIKit.h>

@interface GragView : UIImageView
{
    CGPoint startPoint;
}
@end

#import "GragView.h"

@implementation GragView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        //允许用户交互
        self.userInteractionEnabled = YES;
    }
    return self;
}

- (id)initWithImage:(UIImage *)image
{
    self = [super initWithImage:image];
    if (self) {
        //允许用户交互
        self.userInteractionEnabled = YES;
    }
    return self;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //保存触摸起始点位置
    CGPoint point = [[touches anyObject] locationInView:self];
    startPoint = point;
    
    //该view置于最前
    [[self superview] bringSubviewToFront:self];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    //计算位移=当前位置-起始位置
    CGPoint point = [[touches anyObject] locationInView:self];
    float dx = point.x - startPoint.x;
    float dy = point.y - startPoint.y;
    
    //计算移动后的view中心点
    CGPoint newcenter = CGPointMake(self.center.x + dx, self.center.y + dy);
    
    
    /* 限制用户不可将视图托出屏幕 */
    float halfx = CGRectGetMidX(self.bounds);
    //x坐标左边界
    newcenter.x = MAX(halfx, newcenter.x);
    //x坐标右边界
    newcenter.x = MIN(self.superview.bounds.size.width - halfx, newcenter.x);
    
    //y坐标同理
    float halfy = CGRectGetMidY(self.bounds);
    newcenter.y = MAX(halfy, newcenter.y);
    newcenter.y = MIN(self.superview.bounds.size.height - halfy, newcenter.y);
    
    //移动view
    self.center = newcenter;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end


效果图








版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Linux Qt应用程序的守护精灵

Linux  Qt应用程序的守护精灵需求点        当我们希望应用程序被意外关闭、中止后,能够立即重新启动,就需要守护精灵来帮忙。     P.S.:不是病毒不是病毒……实现方案   ...

Qt - 与众不同的电子时钟

Qt的电子时钟是个老掉牙的demo了,但是利用lcdNumber显示的样子非常老土(下图第一个显示效果),一看就知道是从qt帮助文档里摘出来的example,毫无新意。           美化一下系...

iOS开发练习小程序——秒表

最近工作不忙,闲暇之余自学了一下object-c,体验了一把ios无敌的framework。想写个小应用练练手,给自己挑了个简单的题目:模仿实现一下ios系统应用时钟里的秒表程序,就是这个应用:主要实...

Qt :非window子窗体的透明度设置

✿问题的由来         心血来潮,想利用QTimer 配合 setWindowOpacity()方法来实现一个窗体淡入的效果。✿实验代码 粗糙的实验代码:void Widget::on_push...

女程共勉:必须证明自己是真正的优秀

女程共勉:必须证明自己是真正的优秀             不得不承认,在这个数量上男性占主导的IT行业,女程序员的工作能力常常遭到质疑。有些企业暗文规定不招女开发,有些企业频频降低招聘要求,抢招女开...

为Android应用程序读取/dev下设备而提权(一)

为Android应用程序读取/dev下设备而提权(一)         倘若应用程序需要对/dev/xxx进行读写操作,就需要提升其权限。提权方法不唯一,需要根据具体需求情况而选择。归根结底,终究都落...

程序一点点地写,日子一天天地过。

我还记得那天我上班正忙,被一团恶心的程序和一堆变态的需求折磨着,我那伟大的母亲大人特地打电话嘱咐我:“新婚姻法告诉我们,男人的车子不可靠了,房子不可靠了,女人必须得靠自己!”  字正腔圆,铿锵有力,顿...

为Android应用程序读取/dev下设备而提权(二)

为Android应用程序读取/dev下设备而提权(二)                  在为Android应用程序读取/dev下设备而提权(一)中,简单总结了提权的两种方法: device...

400% 的飞跃-web 页面加载速度优化实战

前言 一个网站的加载速度有多重要? 反正我相信之前来博主网站的人至少有 50% 在加载完成前关闭了本站。 为啥捏? 看图 首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈...

Android学习之Android studio TraceView和lint工具的使用详解

上次讲述了一下Android studio Terminal的使用配置,今天又学习了一下关于Traceview和lint工具的使用。首先来讲lint吧:Android lint工具是Android s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)