解決pan手勢(shì)子控件超出父控件問題

最近項(xiàng)目中遇到這樣一個(gè)問題:

生成一張圖片按鈕,然后在圖片父控件中拖拽.給圖片添加一個(gè)pan手勢(shì),但發(fā)現(xiàn)在默認(rèn)拖拽過程中,子控件可以超出父控件范圍
而同事寫的安卓版本子控件不超出父控件范圍,因?yàn)榘沧磕J(rèn)這樣.產(chǎn)品經(jīng)理要求與他保持一致

我的辦法是:

實(shí)時(shí)獲取子控件在父控件的坐標(biāo),并判斷子控件的 x, y 是否超過父控件的范圍,如果超過則讓其停止拖拽

但遇到一個(gè)問題:

當(dāng)拖拽速度比較慢時(shí)可以實(shí)現(xiàn)那個(gè)效果,當(dāng)拖動(dòng)比較快時(shí)會(huì)感覺到拖拽卡頓. 原因是拖拽和 獲取子,控件坐標(biāo)并判斷方法 都是在主線程中執(zhí)行的.后來 把獲取子控件坐標(biāo)并判斷方法放在子線程中執(zhí)行再回到主線程判斷是否停止拖拽

雖然解決了問題,但是感覺太過于麻煩

最近在github上看別人代碼時(shí),無意中發(fā)現(xiàn)了更好的辦法 -- 使用自動(dòng)布局,給子控件添加約束(這里我使用 了Masonry框架),通過約束來改變子控件坐標(biāo)而不是通過仿射變換來實(shí)現(xiàn)

注意:不要通過設(shè)置控件的transform屬性值或者直接設(shè)置子控件的frame屬性值(例如center)來讓空間位移,否則拖動(dòng)時(shí)子控件還是會(huì)超出父控件的

之前在拖拽子控件代碼是

- (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];
}

只有通過自動(dòng)布局約束才能實(shí)現(xiàn)效果:

1. 先在子控件在創(chuàng)建時(shí)設(shè)置約束來控制其拖拽范圍

    [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. 在拖拽方法里使用約束更新子控件的坐標(biāo)

- (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];
}

運(yùn)行效果:

3.注意: 這種方法還是有局限性,當(dāng)子控件調(diào)用transform屬性放大或縮小時(shí)這種方法失效

  • 子控件調(diào)用transform屬性放大時(shí): 子控件拖拽范圍會(huì)超出父控件
  • 子控件調(diào)用transform屬性縮小時(shí): 子控件拖拽范圍會(huì)縮小
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卧斟,一起剝皮案震驚了整個(gè)濱河市危纫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖动分,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骨田,居然都是意外死亡埠通,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門晦攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闽撤,“玉大人,你說我怎么就攤上這事脯颜∮雌欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵栋操,是天一觀的道長(zhǎng)闸餐。 經(jīng)常有香客問我,道長(zhǎng)矾芙,這世上最難降的妖魔是什么舍沙? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剔宪,結(jié)果婚禮上拂铡,老公的妹妹穿的比我還像新娘。我一直安慰自己葱绒,他們只是感情好感帅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著地淀,像睡著了一般失球。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骚秦,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天她倘,我揣著相機(jī)與錄音,去河邊找鬼作箍。 笑死硬梁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胞得。 我是一名探鬼主播荧止,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了跃巡?” 一聲冷哼從身側(cè)響起危号,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎素邪,沒想到半個(gè)月后外莲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兔朦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年偷线,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽甥。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡声邦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摆舟,到底是詐尸還是另有隱情亥曹,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布恨诱,位于F島的核電站媳瞪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏照宝。R本人自食惡果不足惜材失,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硫豆。 院中可真熱鬧,春花似錦笼呆、人聲如沸熊响。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汗茄。三九已至,卻和暖如春铭若,著一層夾襖步出監(jiān)牢的瞬間洪碳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工叼屠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞳腌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓镜雨,卻偏偏與公主長(zhǎng)得像嫂侍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評(píng)論 25 707
  • 1挑宠、窗體 1菲盾、常用屬性 (1)Name屬性:用來獲取或設(shè)置窗體的名稱,在應(yīng)用程序中可通過Name屬性來引用窗體各淀。 ...
    Moment__格調(diào)閱讀 4,505評(píng)論 0 11
  • 反正又畫丑了懒鉴,悲傷 一生中,有些人是陪你看日出的碎浇,有些人是陪你看日落的临谱。 再不濟(jì),你還有自己南捂,充實(shí)而豐富的人生是美...
    薄荷與自己和解閱讀 186評(píng)論 0 2
  • 星星熄滅 白熾燈也不亮了 在沉默中死亡吴裤,才不會(huì)遇見光 光也是我的俘虜 變成黑暗扎根心臟 血只有一滴 在閣樓的木板上...
    青回音閱讀 313評(píng)論 8 5
  • 聽說鞭缭,一個(gè)完整的夏天 =西瓜 + 空調(diào) + 可樂 + 手機(jī) wifi 滿格 剖膳, 可如果只能選其中的兩樣,你會(huì)選什么...
    奧荔薇O(jiān)live閱讀 2,285評(píng)論 8 69