国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ios中創(chuàng)建可以拖動(dòng)的view原理和實(shí)現(xiàn)詳解

2019-11-14 20:27:31
字體:
供稿:網(wǎng)友

有時(shí)候我們會(huì)需要在界面上拖動(dòng)view;uiview是繼承于uiresponder的,所以可以響應(yīng)觸摸相關(guān)的事件。

重點(diǎn)是以下一組方法:

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

 

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

 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event     // 觸摸事件結(jié)束,如果你需要自動(dòng)把view停靠到一個(gè)位置,實(shí)現(xiàn)這個(gè)方法

 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event  //外界因素取消touch事件等,如進(jìn)入電話,進(jìn)行特別處理

 

對于最上面兩個(gè)方法是必須實(shí)現(xiàn)的,后面兩個(gè)方法是用來做一些額外的需求或者處理使用,如果只是要實(shí)現(xiàn)拖動(dòng)view可以不實(shí)現(xiàn)。

 

思路1: 創(chuàng)建一個(gè)uiview(或者你需要的控件)的子類,在類中實(shí)現(xiàn)上述的方法。

思路2:在你相應(yīng)的viewcontroller中實(shí)現(xiàn)上述方法(在viewcontroller中持有你要拖動(dòng)的view,這樣才能控制它),也能實(shí)現(xiàn)類似的目的,但這樣觸摸的范圍就會(huì)是整個(gè)viewcontroller的view,你需要在touchesBegan進(jìn)行相應(yīng)的判斷(從UITouch中可以得到view的相關(guān)信息),才能實(shí)現(xiàn)固定在小窗口內(nèi)部的觸摸。

兩種思路都是可行的,根據(jù)你實(shí)際情況去做選擇,都沒有問題。

以下是代碼(子類方式的簡單實(shí)現(xiàn),你也可以進(jìn)行相應(yīng)修改放到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;
}

 

上面的代碼存在一個(gè)問題,那就是他的觸摸移動(dòng)范圍包括了屏幕之外,你會(huì)發(fā)現(xiàn)你可以把view部分拖動(dòng)到屏幕外部。那么我們需要一個(gè)高級一些的實(shí)現(xiàn):

注:這個(gè)版本是基于viewcontroller的實(shí)現(xiàn),并未子類化view;self.localview是你持有的小窗口,beginpoint需要你在viewcontroller中自己定義

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (!self.isInView)    // 僅當(dāng)取到touch的view是小窗口時(shí),我們才響應(yīng)觸控,否則直接return
    {
        return;
    }
    
    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.localView];
    //偏移量
    float offsetX = currentPosition.x - beginpoint.x;
    float offsetY = currentPosition.y - beginpoint.y;
    //移動(dòng)后的中心坐標(biāo)
    self.localView.center = CGPointMake(self.localView.center.x + offsetX, self.localView.center.y + offsetY);
    
    //x軸左右極限坐標(biāo)
    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軸上下極限坐標(biāo)
    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為小窗口的寬度(簡單起見這里使用硬編碼示例),用來判斷觸控范圍;僅當(dāng)取到touch的view是小窗口時(shí),我們才響應(yīng)觸控
    {
        self.isInView = YES;
    }
    else
    {
        self.isInView = NO;
    }
    beginpoint = [touch locationInView:self.localView];
    
    [super touchesBegan:touches withEvent:event];
}

原文:http://www.codesocang.com/jiaocheng/shoujikaifa/2014/0430/7233.html


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霍山县| 承德县| 尼勒克县| 昌吉市| 龙游县| 黎川县| 平利县| 泰宁县| 井冈山市| 巴林左旗| 胶州市| 龙川县| 上思县| 申扎县| 玉林市| 易门县| 龙井市| 麻城市| 宜城市| 郑州市| 武宣县| 桐柏县| 海淀区| 琼结县| 磐石市| 边坝县| 阳原县| 梁山县| 赫章县| 定结县| 汉阴县| 普格县| 广河县| 白水县| 石河子市| 陵水| 双鸭山市| 屏东县| 三门县| 德昌县| 宣恩县|