Subview的事件響應
在view的層級裡面,預設情況下subview是可以顯示到其父view的frame區域以外的,通過設定clipToBounds屬性為YES,可以限制subview的顯示區域。但是touch在各個UIView中傳遞的時候,區域時限制在view的frame内,此處包含兩個資訊:1、在目前view的frame以外所做的操作是不會傳遞到該view中的,這一點很容易了解。2、如果touch事件是發生在目前view的frame以外,該view所有的subview将也不會再收到該消息。這一點通常容易被我們忽略,很多奇怪的問題就是這個引起的。
下面請看一個小例子,定制view的代碼如下:
SvTestClipSubviewEvent.h
SvTestClipSubviewEvent.m
在程式的ViewController中添加如下測試代碼:
運作可以看到如下界面:
該例子中我們設定定制view的背景顔色為紅色,然後建立一個位于定制view外的UIButton “I'm out”以及另一個位于定制view内的UIButton “I‘m in”。運作程式,我們可以發現點選"I'm out"按鈕時界面根本沒有變化,在btnAction:函數中加斷點,也不會進去,這就說明該按鈕根本沒有接受到消息,同時“I'm in”按鈕運作正常,點選後控制台會輸出資訊“...UIViewSample[664:f803] HI, you tap button I'm in”。這些可以說明subview接收事件的範圍是受其superview的frame閑限制的,不可能接受到superview的frame以外的touch事件。
如果我們的程式有些時候看着一些按鈕明明正常但是卻不能正常接收touch消息的時候,可能就是其顯示位置已經跑出了superview的frame範圍了。是以程式的rootview一定要時刻充滿整個window,否則就可能導緻程式的某些地方不能正常相應使用者消息。同時建議對于那些隻是充當容器的view,最好設定autoresizingMask的值為UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight,這樣當其superview的大小發生變化時候就會自動縮放至superview一樣大小,保證每一刻都充滿其superview,進而避免因顯示位置出界導緻的不能正常相應使用者touch事件等問題。
部門招人: 進階iOS、Android、前端開發,有意私聊,部落客請你喝️
如果覺得本文幫到了你,記得點贊哦,當然也可以請部落客喝一杯豆漿
微信二維碼
QQ二維碼