iOS之擴大UIButton(UIView)的點擊范圍

前言

UI給的圖有時候很小描函,或者有個需求需要我們擴大button的點擊區(qū)域

我們一般的操作是在button 上添加一個view 增加點擊事件印蔬,但是我們還有其他更方便的方法去擴大button 的點擊區(qū)域狼荞。

思考

怎樣來實現(xiàn)這個功能呢派哲?又有多少種方式可以實現(xiàn)呢偎血?下面一一來講霸株。

  • 理解事件傳遞過程雕沉,用這個來實現(xiàn)擴大點擊范圍
  • 使用Runtime機制擴大點擊范圍

時間傳遞過程

當用戶點擊屏幕后:

  1. UIApplication 先響應事件。

  2. 然后傳遞給UIWindow去件。

  3. 如果window可以響應坡椒。就開始遍歷window的subviews。遍歷原則是:從離用戶最近的那個子視圖去遍歷

  4. 遍歷的過程中尤溜,如果第一個遍歷的view1可以響應倔叼,那就遍歷這個view1的subviews(依次這樣不停地查找,直至查找到合適的響應事件view)宫莱。

  5. 如果view1不可以響應丈攒,那就開始對view2進行判斷和子視圖的遍歷。依次類推view3授霸,view4……

  6. 如果最后沒有找到合適的響應view巡验,這個消息就會被拋棄。這個就是iOS中的事件鏈碘耳。

如下圖所示:

事件傳遞過程.png

然而事件的響應鏈條是事件鏈條的逆向显设,根據(jù)視圖層級的添加順序從后往前的

擴大UIButton范圍關鍵的兩個方法:UIView方法

// recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;

// default returns YES if point is in bounds
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;

第一種方法

繼承與UIButton,重寫下面的方法:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
    CGRect bounds = self.bounds;
    //擴大原熱區(qū)直徑至26辛辨,可以暴露個接口捕捂,用來設置需要擴大的半徑。
    CGFloat widthDelta = 26;
    CGFloat heightDelta = 26;
    bounds = CGRectInset(bounds, -0.5 * widthDelta, -0.5 * heightDelta);
    return CGRectContainsPoint(bounds, point);
}

第二種:重寫方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    CGRect rectRange = CGRectInset(self.bounds, -30.0, -30.0);
    
    if (CGRectContainsPoint(rectRange, point)) {
        return self;
    }else{
        return nil;
    }
    
    return self;
}

其實我們上面所做的變化其實如果仔細看點擊區(qū)域還是個矩形斗搞,如果需要我們將點擊區(qū)域規(guī)定在圓形范圍 內指攒,我們可以這樣做:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    [super hitTest:point withEvent:event];
    
    CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
    
    
   //當然這個半徑也可以擴大
    CGFloat raidus = self.frame.size.height >= self.frame.size.width ?self.frame.size.width/2 :self.frame.size.width/2;
    
   //傳入中心點 實時點擊點 與半徑判斷 點擊點是否在半徑區(qū)域內
    BOOL pointInRound =[self touchPointInsideCircle:center radius:raidus targetPoint:point];
    
    if (pointInRound) {
        return self;
    }else
    {
        return nil;
    }
}

//用來判斷 圓形點擊區(qū)域
- (BOOL)touchPointInsideCircle:(CGPoint)center radius:(CGFloat)radius targetPoint:(CGPoint)point {
    CGFloat dist = sqrtf((point.x - center.x) * (point.x - center.x) +
                         (point.y - center.y) * (point.y - center.y));
    return (dist <= radius);
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僻焚,隨后出現(xiàn)的幾起案子允悦,更是在濱河造成了極大的恐慌,老刑警劉巖溅呢,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澡屡,死亡現(xiàn)場離奇詭異,居然都是意外死亡咐旧,警方通過查閱死者的電腦和手機驶鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣墨,“玉大人室埋,你說我怎么就攤上這事∫猎迹” “怎么了姚淆?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屡律。 經常有香客問我腌逢,道長,這世上最難降的妖魔是什么超埋? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任搏讶,我火速辦了婚禮,結果婚禮上霍殴,老公的妹妹穿的比我還像新娘媒惕。我一直安慰自己,他們只是感情好来庭,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布妒蔚。 她就那樣靜靜地躺著,像睡著了一般月弛。 火紅的嫁衣襯著肌膚如雪肴盏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天尊搬,我揣著相機與錄音叁鉴,去河邊找鬼。 笑死佛寿,一個胖子當著我的面吹牛幌墓,可吹牛的內容都是我干的。 我是一名探鬼主播冀泻,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼常侣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弹渔?” 一聲冷哼從身側響起胳施,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肢专,沒想到半個月后舞肆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焦辅,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年椿胯,在試婚紗的時候發(fā)現(xiàn)自己被綠了筷登。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哩盲,死狀恐怖前方,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情廉油,我是刑警寧澤惠险,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站抒线,受9級特大地震影響班巩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嘶炭,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一趣竣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旱物,春花似錦遥缕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宝穗,卻和暖如春户秤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逮矛。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工鸡号, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人须鼎。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓鲸伴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晋控。 傳聞我的和親對象是個殘疾皇子汞窗,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • 重點參考鏈接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi閱讀 4,430評論 0 15
  • 初識iOS APP開發(fā)#### 在iOS APP開發(fā)中, main函數(shù)仍是程序的入口和出口, 但main函數(shù)不需要...
    DeanYan閱讀 6,163評論 0 3
  • 怎樣來實現(xiàn)這個功能呢?又有多少種方式可以實現(xiàn)呢赡译?下面一一來講仲吏。 理解事件傳遞過程,用這個來實現(xiàn)擴大點擊范圍使用Ru...
    karven閱讀 7,426評論 2 59
  • 概述 iOS響應者鏈(Responder Chain)是支撐App界面交互的重要基礎,點擊裹唆、滑動誓斥、旋轉、搖晃等都離...
    嚕嚕嚕嚕嚕嚕嚕嚕閱讀 706評論 0 6
  • 在iOS開發(fā)中經常會涉及到觸摸事件许帐。本想自己總結一下岖食,但是遇到了這篇文章,感覺總結的已經很到位舞吭,特此轉載。作者:L...
    WQ_UESTC閱讀 6,009評論 4 26