一、問題描述
因為項目需要,需要UITableView上添加固定的篩選表頭,一直固定,不能隨UITableView滾動。所以直接將表頭與UITableView分離,將它添加到控制器的UIView上,即添加到UITableView的父視圖上,與UITableView同級。然后表頭上添加三個UIButton,效果達到預期,但問題隨即出現。篩選表頭上的UIButton無法響應點擊事件,剛開始以為造成的原因是手誤把UIButton的父視圖或者UIButton屬性userInteractionEnabled被設置為NO,試着UIButton的父視圖和UIButton的userInteractionEnabled統統設置YES,仍然無法解決這個問題。
二、問題分析
UIButton不能響應點擊事件的原因大概有以下三種:
1. UIButton的userInteractionEnabled默認YES,如果設置NO,UIButton就不會有響應點擊事件,同時如果 UIButton的父視圖的userInteractionEnabled屬性為NO,UIButton也會受到影響,不會有響應。
從UIButton的父視圖和UIButton的userInteractionEnabled統統設置YES,這個問題仍然無法解決,所以不是這個問題。
2. 另外就是button本身的frame問題,或者有沒有一層視圖蓋住了button導致按鈕無響應,簡單來說就是按鈕本身和按鈕他爹(父視圖)的問題。
3. UIButton不能響應點擊事件的另一個原因是和UIButton的父視圖有關系。如果父視圖frame是CGRectZero,或者UIButton超出父視圖,UIButton還是會顯示的,但詭異的是UIButton是不會響應點擊事件的,所以要調整父視圖的frame或者UIButton位置。
第一種:試過了,排除。
第二種:因為用到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); }];
效果如下:
然后加上UIButton,UIButton能響應點擊事件