1. 程式人生 > >按鈕超出父控制元件後無法響應點選的解決方法

按鈕超出父控制元件後無法響應點選的解決方法

當我們在螢幕上做了一個點選操作(事件),系統會將該事件傳給由UIApplication管理的一個事件佇列中,UIApplication會將事件佇列中最前面的一個事件傳遞給程式的主視窗(key window),主視窗會自動呼叫下面的方法:

func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?

這個方法返回的view為處理事件最合適的view。

當事件傳遞給主視窗之後,這個事件會從父檢視一層層傳遞給子檢視:如果父檢視中沒有子檢視或者子檢視不能響應事件(isUserInteractionEnabled == false),則父檢視為處理事件最合適的view,否則繼續將事件傳遞給子檢視。

當子檢視超出了父檢視時,超出部分是不能響應事件的,原因是觸控點不在父檢視中,所以無法正確返回子檢視作為處理事件合適的view。所以我們就需要在父檢視中重寫hitTest方法,返回子檢視:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {

        var view = super.hitTest(point, with: event)

        if view == nil {
        // 轉移座標系
            if let temPoint =
self.plusBtn?.convert(point, from: self) { // 判斷點選的點是否在按鈕內 if self.plusBtn?.bounds.contains(temPoint) == true { view = self.plusBtn } } } return view }

相關推薦

按鈕超出控制元件無法響應解決方法

當我們在螢幕上做了一個點選操作(事件),系統會將該事件傳給由UIApplication管理的一個事件佇列中,UIApplication會將事件佇列中最前面的一個事件傳遞給程式的主視窗(key window),主視窗會自動呼叫下面的方法: func hitT

android關於 子控制元件超出控制元件範圍的注意

通過 搜尋引擎的搜尋,我們知道了android:clipChildren = "false"  這個屬性 可以讓父view 在子view超出以後不切割子view。 那麼我現在說幾個注意點,如果你沒有注意這幾個點可能子view 超不出去。   android:clipC

Android_關於子控制元件控制元件的事件響應問題

當父控制元件中有子控制元件的時候,並且父控制元件和子空間都有事件處理(比如單擊事件)。這時,點選子控制元件,父控制元件的單擊事件就無效了。如下圖: 比如一個LinearLayout裡面有一個子控制元件TextView,但是TextView的大小沒有LinearLayout大 ①如果LinearLayout和

ios 超出控制元件區域支援事件

標題中的需求其實常常能遇到,如下圖 圖 1 當按鈕超出Tab bar的view後,那麼其實按鈕超出的部分是無法被點選的。那麼先來說說解決辦法 1.我們重寫藍色view的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEven

UI控制元件無法響應等事件的探索

轉自:hcios.com 一、響應者鏈 關於響應者鏈,有如下一段介紹:每一個應用有一個響應者鏈,我們的檢視結構是一個N叉樹(一個檢視可以有多個子檢視,一個子檢視同一時刻只有一個父檢視),而每一個繼承UIResponder的物件都可以在這個N叉樹中扮演一個節點。當葉節

SQLServer 數據庫變成單個用戶無法訪問問題的解決方法

master alt arch pre server tab process sele processes USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL=‘‘ SELECT @SQL=@SQL+‘;

SQLServer 資料庫變成單個使用者無法訪問問題的解決方法

USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @[email protected]+'; KILL '+RTRIM(SPID) FROM master..sysprocesses WHERE dbid=DB_ID('資料庫名

Fragment onActivityResult提前響應,startActivityForResult執行立即響應onActivityResult的解決方法

找不到病根真是讓人愁白了頭; 今天寫了一個startActivityForResult,開啟一個Activity並拿到返回的結果,但是startActivityForResult剛走,onActivityResult就立即響應了,這我要這個onActivityResult有何用; 來看開啟程

WPF中重疊控制元件的滑鼠穿透

Problem:有控制元件A和控制元件B,位置完全重疊,B覆蓋在A上方。換句話說,B只是A的修飾(實現中經常有可能會碰到這樣的情況,比如B可能是一個png圖片,你又不想重寫A的模板),我們需要在滑鼠操作時透過B直接點選到A。 Solution:你可能會想讓B的滑鼠事件不執行(e.handle=f

WordPress修改主題無法正常顯示頁面解決方法

下午看到一個挺漂亮的主題,下載來想試用下看看效果,結果卻導致我的前臺頁面無法正常顯示,成白板兒了,這下鬱悶了,難道又要折騰了,悲劇,不過想起來WP的所有配置相關的東西全存在資料庫裡,去資料庫裡改了主題不就行了嗎?絕佳的好辦法。從空間後臺進入phpMyAdmin,開啟wp_options表(注意:你的表格名稱字

關於Windows10+Ubuntu18.04 雙系統安裝無法啟動Ubuntu的解決方法

小白用了一天的時間裝Ubuntu,安裝成功之後出現了不能識別Grub啟動Ubuntu,直接進入Windows系統的情況。由於網上大多數教程都是解決無法啟動Windows的問題,所以把不能啟動Ubuntu的解決方法彙總一下,希望可以幫到和我遇到同樣問題的小白OwO安裝過程就不詳

ubantu16.04TLS fcitx和搜狗拼音安裝無法正常啟動的解決方法

在網上有很多關於fcitx和搜狗的安裝的帖子和處理無法啟動的方法。不過很可惜,可能是本人運氣不好,嘗試了能找到的方法均已失敗告終。經過自己的多次嘗試和對網上找到的方法的總結找到了一種可行的解決方法。(本方法不需要用到終端,也不需要敲程式碼,屬於通俗易懂新手教程) 首先在Ub

一臺主機利用apache伺服器開啟虛擬主機無法使用www域名解決方法

同一臺主機一般只有一個域名,為了能放置許多不同型別的網站,需要將主機配置成虛擬主機來使用,配置的方法很多,詳細的過程可以參照網上其他部落格等,這裡強調apache的conf檔案的兩個重要的地方: 1.

Linux--忘記MySQL密碼的解決方法和輸入mysqld_safe --skip-grant-tables &無法進入MySQL的解決方法

在Linux下忘記MySQL密碼後我們可以通過一個mysql的引數–skip-grant-tables &輕鬆解決這個問題 親測在CentOS有效 其中 --skip-grant-tables 的意思是跳過授權表,通過此引數來跳過輸入密碼,後面跟得 &a

android popupwindow中使用ListView無法響應事件

在PopupWindow中使用ListView, 但是ListView中的各個item無法響應事件(如:ListView可以滑動,但是item無法點選),這是需要新增  mPopupwindow.se

指定控制元件的防止重複判斷

日常開發中,一般網路請求會做一些按鈕重複點選判斷(比如登入時點選登入按鈕),為了方便,可以把方法寫到基類裡面,這樣繼承類就可以直接用了。當然如果放到utils中也行。廢話不多少,直接上程式碼;變數:/*

C++實現WebBrowser控制元件中對滑鼠事件的監聽,並獲取所標籤的超連結

        主要步驟如下:         1、接收網頁事件(參考資料) 要響應網頁事件,需要實現IDispatch介面,並在其Invoke()方法中處理收到的訊息。對於MFC,因為CCmdTarget類已經實現了該介面,所以只需要繼承CCmdTarget並結合相關巨

android EditText彈鍵盤,其他控制元件收鍵盤不觸發事件,特1控制元件收鍵盤觸發,特2控制元件不收鍵盤

說實話開發android,鍵盤真的很不聽話,非常難用,於是百度找到dispatchTouchEvent進行重寫可完成鍵盤收放,但還是不夠完美,我期望的功能如下: 1.基礎功能: a.點選輸入控制元件彈出鍵盤 b.點選非輸入控制元件收起鍵盤 2.特殊功能1

$.ajax返回的JSON格式的資料無法執行success的解決方法

近段時間做專案,在專案使用了ajax技術,遇到了一個奇怪的問題:"$.ajax返回的JSON格式的資料無法執行success",程式碼是這樣寫的: 1 $.ajax({ 2 .. 3 dataType:'json', 4 ... 5 success:f

安裝centos無法獲取IP的解決方法

好多時候,在虛擬機器中安裝完後,進去centos中,使用ifconfig發現沒有此命令,可使用ip a檢視IP, 如果沒有ip,一般centos預設安裝不啟用網絡卡,解決辦法: CentOS配置網絡卡開機自動獲取IP地址 開啟 /etc/sysconfig/netw