你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS學習筆記1—UITableViewCell設置

iOS學習筆記1—UITableViewCell設置

編輯:IOS開發綜合

 今天遇到一種情況,當點擊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裡的任一子視圖

 

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved