解决pan手势子控件超出父控件问题

最近项目中遇到这样一个问题:

生成一张图片按钮,然后在图片父控件中拖拽.给图片添加一个pan手势,但发现在默认拖拽过程中,子控件可以超出父控件范围
而同事写的安卓版本子控件不超出父控件范围,因为安卓默认这样.产品经理要求与他保持一致

我的办法是:

实时获取子控件在父控件的坐标,并判断子控件的 x, y 是否超过父控件的范围,如果超过则让其停止拖拽

但遇到一个问题:

当拖拽速度比较慢时可以实现那个效果,当拖动比较快时会感觉到拖拽卡顿. 原因是拖拽和 获取子,控件坐标并判断方法 都是在主线程中执行的.后来 把获取子控件坐标并判断方法放在子线程中执行再回到主线程判断是否停止拖拽

虽然解决了问题,但是感觉太过于麻烦

最近在github上看别人代码时,无意中发现了更好的办法 -- 使用自动布局,给子控件添加约束(这里我使用 了Masonry框架),通过约束来改变子控件坐标而不是通过仿射变换来实现

注意:不要通过设置控件的transform属性值或者直接设置子控件的frame属性值(例如center)来让空间位移,否则拖动时子控件还是会超出父控件的

之前在拖拽子控件代码是

- (void)pan:(UIPanGestureRecognizer *)panGesture{
    UIView *button = panGesture.view;
    button.transform = CGAffineTransformTranslate(button.transform, [panGesture translationInView:panGesture.view].x, [panGesture translationInView:panGesture.view].y);
    [panGesture setTranslation:CGPointZero inView:panGesture.view];
}

或是

- (void)pan:(UIPanGestureRecognizer *)panGesture{
    UIView *button = panGesture.view;
    CGPoint point = [panGesture translationInView:button];    
    CGPoint newCenter = CGPointMake(point.x + button.center.x,  point.y + button.center.y);
    button.center = newCenter;    
    [panGesture setTranslation:CGPointZero inView:button];
}

只有通过自动布局约束才能实现效果:

1. 先在子控件在创建时设置约束来控制其拖拽范围

    [button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(40, 40));
        make.right.lessThanOrEqualTo(button.superview);
        make.left.greaterThanOrEqualTo(button.superview);
        make.top.greaterThanOrEqualTo(button.superview).offset(64);
        make.bottom.right.lessThanOrEqualTo(button.superview);
    }];
    

2. 在拖拽方法里使用约束更新子控件的坐标

- (void)pan:(UIPanGestureRecognizer *)panGesture{
    UIView *button = panGesture.view;
    CGPoint newCenter = CGPointMake([panGesture translationInView:button].x + button.center.x - button.superview.bounds.size.width / 2, + button.center.y + [panGesture translationInView:button].y - button.superview.bounds.size.height / 2);
    
    [button mas_updateConstraints:^(MASConstraintMaker *make) {
        make.center.mas_equalTo(newCenter).priorityLow();
    }];
    
    [panGesture setTranslation:CGPointZero inView:panGesture.view];
}

运行效果:

3.注意: 这种方法还是有局限性,当子控件调用transform属性放大或缩小时这种方法失效

  • 子控件调用transform属性放大时: 子控件拖拽范围会超出父控件
  • 子控件调用transform属性缩小时: 子控件拖拽范围会缩小
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,400评论 25 707
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,477评论 0 11
  • 反正又画丑了,悲伤 一生中,有些人是陪你看日出的,有些人是陪你看日落的。 再不济,你还有自己,充实而丰富的人生是美...
    薄荷与自己和解阅读 186评论 0 2
  • 星星熄灭 白炽灯也不亮了 在沉默中死亡,才不会遇见光 光也是我的俘虏 变成黑暗扎根心脏 血只有一滴 在阁楼的木板上...
    青回音阅读 310评论 8 5
  • 听说,一个完整的夏天 =西瓜 + 空调 + 可乐 + 手机 wifi 满格 , 可如果只能选其中的两样,你会选什么...
    奥荔薇Olive阅读 2,283评论 8 69