今天遇到一種情況,當點擊UITableViewCell高亮時,其子視圖中有高亮的對象也高亮了,折騰了很久都沒有搞定,跟同事們一起研究也沒有找到方法,後來在網上找到了解決的方法,現在分享一下!
為了進行UI自定義,修改了UITableViewCell的accessoryView,如下
UIButton * accessoryDetailDisclosureButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
[accessoryDetailDisclosureButton setImage:[UIImage imageNamed:@"accessoryDetailDisclosureButton_normal.png"] forState:UIControlStateNormal];
[accessoryDetailDisclosureButton setImage:[UIImage imageNamed:@"accessoryDetailDisclosureButton_highlighted.png"] forState:UIControlStateHighlighted];
[accessoryDetailDisclosureButton addTarget:self action:@selector(accessoryDetailDisclosureButtonPress:) forControlEvents:UIControlEventTouchUpInside];
cell.accessoryView = accessoryDetailDisclosureButton;
[accessoryDetailDisclosureButton release];
實現如下的效果
可是在cell被選中的時候,卻連帶把accessoryView的狀態也修改成了highlighted,如下
最後的解決辦法就是繼承UITableViewCell來進行cell按下動作時的狀態修改,如下
@interfaceUCaiTableViewCell : UITableViewCell
@end
@implementationUCaiTableViewCell
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
[(UIButton *)self.accessoryView setHighlighted:NO];
}
@end
從而實現了如下效果
以上的修改辦法,雖然可以讓cell在按下的時候,accessoryView的highlighted修改為NO,但是在手指向上離開cell時,accessoryView的highlighted任然被修改成了YES;
所以要想實現cell被按下和松開時都不會影響其上子視圖的highlighted的話,需要了解TableView與TableViewCell在按下時的協作關系。
當手指在cell上按下,cell被選中的這一動作中,系統調用了如下一序列方法
-------------------------------------------------------------------------------------------------------------------
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated UITableViewCell (手指按下cell時) highlighted:YES
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated UITableViewCell (手機離開cell時) highlighted:NO
tableView:willSelectRowAtIndexPath: UITableView (手機離開cell,並選中cell時)
- (void)setSelected:(BOOL)selected animated:(BOOL)animated UITableViewCell (手機離開cell,並選中cell時) selected:YES
tableView:didSelectRowAtIndexPath: UITableView (手機離開cell,並選中cell時)
-------------------------------------------------------------------------------------------------------------------
其實cell上的子視圖在cell被高亮的同時也會被高亮,是因為UITableViewCell的selectedBackgroundView影響。當UITableViewCell為選中狀態時,UITableViewCell把selectedBackgroundView當作一個子視圖來添加,selectedBackgroundView被添加在UITableViewCell的backgroundView之上,或者所有其它視圖之下。當調用setSelected: animated:這一方法時,會導致selectedBackgroundView以一個alpha消化的狀態來出現和消失。
因此我們可知道,如果UITableViewCell的selectionStyle值為UITableViewCellSelectionStyleNone時,selectedBackgroundView將不起作用。
我們進行以下的子類化,就可解決以上我們遇到的問題
@interfaceUCaiTableViewCell : UITableViewCell
@end
@implementationUCaiTableViewCell
@synthesizepiosaDelegate = _piosaDelegate;
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{
[super setHighlighted:highlighted animated:animated];
if(highlighted) {
[(UIButton *)self.accessoryView setHighlighted:NO];
}
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
[super setSelected:selected animated:animated];
if(selected) {
[(UIButton *)self.accessoryView setHighlighted:NO];
}
}
至此,在cell高亮的情況下,其accessoryView都不會受其影響,變為高亮狀態了,同樣的道理都適用於cell裡的任一子視圖