UIButton是iOS開發(fā)中最常用的控件矮男,初學者需要了解其基本定義和常用設(shè)置捐川,以便在開發(fā)在熟練運用。
但是有些時候UIButton無法響應點擊事件傻昙。
問題描述
因為項目需要闺骚,需要UITableView上添加固定的篩選表頭,一直固定妆档,不能隨UITableView滾動僻爽。所以直接將表頭與UITableView分離,將它添加到控制器的UIView上贾惦,即添加到UITableView的父視圖上胸梆,與UITableView同級。然后表頭上添加三個UIButton须板,效果達到預期碰镜,但問題隨即出現(xiàn)。篩選表頭上的UIButton無法響應點擊事件逼纸,剛開始以為造成的原因是手誤把UIButton的父視圖或者UIButton屬性userInteractionEnabled被設(shè)置為NO洋措,試著UIButton的父視圖和UIButton的userInteractionEnabled統(tǒng)統(tǒng)設(shè)置YES,仍然無法解決這個問題杰刽。
問題分析
UIButton不能響應點擊事件的原因大概有以下三種:
- UIButton的userInteractionEnabled默認YES菠发,如果設(shè)置NO,UIButton就不會有響應點擊事件贺嫂,同時如果 UIButton的父視圖的userInteractionEnabled屬性為NO滓鸠,UIButton也會受到影響,不會有響應第喳。
- 另外就是button本身的frame問題糜俗,或者有沒有一層視圖蓋住了button導致按鈕無響應,簡單來說就是按鈕本身和按鈕他爹(父視圖)的問題曲饱。
- UIButton不能響應點擊事件的另一個原因是和UIButton的父視圖有關(guān)系悠抹。如果父視圖frame是CGRectZero,或者UIButton超出父視圖扩淀,UIButton還是會顯示的楔敌,但詭異的是UIButton是不會響應點擊事件的,所以要調(diào)整父視圖的frame或者UIButton位置驻谆。
第一種:試過了卵凑,從UIButton的父視圖和UIButton的userInteractionEnabled統(tǒng)統(tǒng)設(shè)置YES,這個問題仍然無法解決胜臊,所以不是這個問題勺卢。排除。
第二種:因為用到MBProgressHUD象对,所以第二種有可能黑忱。但經(jīng)過調(diào)試,發(fā)現(xiàn)MBProgressHUD是隱藏的,不會遮擋點擊事件杨何,同時假設(shè)MBProgressHUD不隱藏酱塔,應該同級的UITableView也不能點擊,但UITableView能響應點擊事件危虱,所以第二種也排除羊娃。
第三種:但先設(shè)置UIButton的父視圖背景色為紅色,同時先把UIButton都去掉埃跷,調(diào)試發(fā)現(xiàn)UIView并沒有顯示出來蕊玷。打印UIView的frame,值為{{0, 0}, {414, 44}}弥雹。原來問題出現(xiàn)在這里垃帅。為什么不能顯示?
原來我設(shè)置了frame剪勿,還用Masonry設(shè)置約束贸诚。設(shè)置了約束,frame是無效的厕吉,同時因為約束設(shè)置不合理酱固,導致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去掉头朱,同時設(shè)置一個高度約束
[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能響應點擊事件