超出父視圖的button,可以將button的frame依照(0,0)點設置好,然後更新center,或許直接將button設置初始坐標在超出視圖的地位,這很復雜!
難點在於,如何讓超出父視圖的button局部呼應我們的點擊事情!
首先需求普及的是點擊事情的呼應鏈!
使用順序在接納到用戶的點擊事情後,UIKit會將屏幕接納到的事情(UIEvent)放在一個事情隊列裡,然後UIApplication的單例會從這個事情
隊列裡順次取出事情,然後開端分發事情!
在分發進程中首先需求確定事情發作的點在哪個視圖中,於是會順次從UIWindow開端調用hitTest:withEvent辦法來確定事情能否發作在
該視圖中,假如在該視圖中,則會對該視圖的子
視圖持續調用這個辦法停止查找,直到找到該事情發作的視圖!
在查找進程中會經過pointInside:withEvent來確定事情發作的點能否在該視圖中,假如pointInside辦法前往了NO,則hitTest辦法將不再對
該視圖的子視圖持續查找,假如前往了YES,闡明事情發作的點在這個視圖內,則會持續對這個視圖的子視圖停止查找!
這個查找進程不會只停止一次,我的復雜測試中都是調用兩次,沒有找到相關緣由,猜想是針對確定事情點的地位和多點手勢或拖拽等復雜手勢而發生的反復
確定.
在找到該事情發作的地位後,會看該視圖的呼應者(承繼自UIResponser的對象)能否對這個事情停止了呼應處置,假如沒有處置,則將事情
對其上一級停止傳遞,直到有呼應者處置為止,假如直到最後都沒有呼應者對這個事情停止處置,則將該事情丟棄!
詳細的事情呼應傳遞鏈:subView->superView->...->UIViewController->UIWindow->UIApplication->UIAppDelegate,也就是假如一個時間在傳遞到
UIAppDelegate還沒有處置的話就被丟棄!
原理不想看直接看這裡
所以針對超出父視圖的button的點擊,首先要讓父視圖的hitTest辦法前往不為nil,也就是假如點擊范圍在button范圍內,就讓父視圖的
hitTest辦法前往呼應的按鈕對象,這個進程中需求對點擊事情的坐標停止處置,可以經過調用button的pointInside來確定點擊的點能否在
按鈕上,以此來判別父視圖是該前往按鈕對象還是nil!
詳細操作進程如下
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ // 將點擊事情在父視圖的坐標轉為參照按鈕的坐標,這樣方便確定點擊能否在按鈕上 CGPoint btnPoint = [self.tstBtn convertPoint:point fromView:self]; if ([self.tstBtn pointInside:btnPoint withEvent:event]) { return self.tstBtn; }else{ return [super hitTest:point withEvent:event]; } }
這樣,在確定事情發作的點在button上之後,就可以經過正常的呼應者鏈來確定事情的傳遞了!
經過這種辦法,還可以完成許多效果,比方屏蔽一些操作,或許阻攔操作等!
而針對呼應傳遞鏈可以完成一個操作改動一系列的形態!
比方在ViewController中的touchesBegan中調用[super touchesBegan]辦法,可以在ViewController呼應的同時,UIWindow也停止呼應!
需求留意的是這裡的super並非指ViewController的父類!而是指它的下一個呼應者,即nextResponser!
【怎樣完成超出父視圖的button以及呼應鏈相關內容】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!