UIButton是iOS開發中最常用的控件,初學者需要了解其基本定義和常用設置,以便在開發在熟練運用。
但是有些時候UIButton無法響應點擊事件。
問題描述
因為項目需要,需要UITableView上添加固定的篩選表頭,一直固定,不能隨UITableView滾動。所以直接將表頭與UITableView分離,將它添加到控制器的UIView上,即添加到UITableView的父視圖上,與UITableView同級。然后表頭上添加三個UIButton,效果達到預期,但問題隨即出現。篩選表頭上的UIButton無法響應點擊事件,剛開始以為造成的原因是手誤把UIButton的父視圖或者UIButton屬性userInteractionEnabled被設置為NO,試著UIButton的父視圖和UIButton的userInteractionEnabled統統設置YES,仍然無法解決這個問題。
問題分析
UIButton不能響應點擊事件的原因大概有以下三種:
- UIButton的userInteractionEnabled默認YES,如果設置NO,UIButton就不會有響應點擊事件,同時如果 UIButton的父視圖的userInteractionEnabled屬性為NO,UIButton也會受到影響,不會有響應。
- 另外就是button本身的frame問題,或者有沒有一層視圖蓋住了button導致按鈕無響應,簡單來說就是按鈕本身和按鈕他爹(父視圖)的問題。
- UIButton不能響應點擊事件的另一個原因是和UIButton的父視圖有關系。如果父視圖frame是CGRectZero,或者UIButton超出父視圖,UIButton還是會顯示的,但詭異的是UIButton是不會響應點擊事件的,所以要調整父視圖的frame或者UIButton位置。
第一種:試過了,從UIButton的父視圖和UIButton的userInteractionEnabled統統設置YES,這個問題仍然無法解決,所以不是這個問題。排除。
第二種:因為用到MBProgressHUD,所以第二種有可能。但經過調試,發現MBProgressHUD是隱藏的,不會遮擋點擊事件,同時假設MBProgressHUD不隱藏,應該同級的UITableView也不能點擊,但UITableView能響應點擊事件,所以第二種也排除。
第三種:但先設置UIButton的父視圖背景色為紅色,同時先把UIButton都去掉,調試發現UIView并沒有顯示出來。打印UIView的frame,值為{{0, 0}, {414, 44}}。原來問題出現在這里。為什么不能顯示?
原來我設置了frame,還用Masonry設置約束。設置了約束,frame是無效的,同時因為約束設置不合理,導致UIView無法顯示。
[self.filerView mas_makeConstraints:^(MASConstraintMaker *make)
{
make.left.equalTo(self.view.mas_left);
make.right.equalTo(self.view.mas_right);
make.top.equalTo(self.view.mas_top);
}];
問題解決
UIView的frame去掉,同時設置一個高度約束
[self.filerView mas_makeConstraints:^(MASConstraintMaker *make)
{
make.left.equalTo(strongSelf.view.mas_left);
make.right.equalTo(strongSelf.view.mas_right);
make.top.equalTo(strongSelf.view.mas_top);
make.height.equalTo(@44);
}];
UIView成功顯示
然后加上UIButton,UIButton能響應點擊事件