2009-07-26 11 views
13

Tôi đã thêm một bóng văn bản đến các tế bào trong UITableView của tôi để cung cấp cho họ một cái nhìn khắc:Loại bỏ bóng văn bản trong UITableViewCell khi nó được chọn

cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.000]; 
cell.textLabel.shadowColor = [UIColor whiteColor]; 
cell.textLabel.shadowOffset = CGSizeMake(0, 1); 

Kể từ khi màu bóng thực sự là màu trắng, khi liên tiếp được chọn và trở thành màu xanh, bóng trắng trở nên thực sự có thể nhìn thấy và làm cho văn bản trông xấu xí.

Có ai biết cách xóa bóng trước khi áp dụng kiểu chọn ô mặc định không?

Tôi đã thử:

  1. Sử dụng -tableView:willSelectRowAtIndexPath: để bỏ đặt bóng với cell.textLabel.shadowColor = nil nhưng điều này không làm việc trong thời gian - cái bóng bị unset chỉ sau khi chọn phong cách màu xanh được áp dụng.
  2. Kiểm tra cell.selected trong tableView:cellForRowAtIndexPath: trước khi đặt bóng nhưng điều này rõ ràng không hoạt động vì ô không được vẽ lại sau khi chọn.

Tôi cũng đã cố gắng ghi đè phương thức ủy quyền -tableView:willDisplayCell:forRowAtIndexPath: như Kevin được đề xuất bên dưới. Từ các câu lệnh đăng nhập mà tôi đưa vào, phương thức ủy nhiệm này chỉ được gọi trước khi một ô được rút ra - vào thời điểm một ô được chạm vào, nó đã quá muộn. Đây là mã tôi đã sử dụng

(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"in willDisplayCell"); 
    if (cell.highlighted || cell.selected) { 
    NSLog(@"drawing highlighed or selected cell"); 
    cell.textLabel.shadowColor = nil; 
    } else { 
    cell.textLabel.shadowColor = [UIColor whiteColor]; 
    } 
} 

Trả lời

35

Một cách hoạt động là mở rộng UITableViewCell và ghi đè các phương thức setSelected AND setHighlighted, thiết lập trạng thái thả bóng tương ứng. Điều này sẽ đảm bảo nó được sơn cùng lúc với bản cập nhật tô sáng nền.

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 
    [self applyLabelDropShadow:!highlighted]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    [self applyLabelDropShadow:!selected]; 
} 

- (void)applyLabelDropShadow:(BOOL)applyDropShadow 
{ 
    self.textLabel.shadowColor = applyDropShadow ? [UIColor whiteColor] : nil; 
} 
+0

Thực ra, bạn có thể chỉ cần ghi đè setHighlighted: hoạt ảnh và không chạm vào setSelected: animated at all. Tôi sẽ thử điều đó trước. –

+0

Cảm ơn Mike! Điều này hoạt động hoàn hảo. –

+3

Tôi có thể xác nhận rằng bạn cần ghi đè cả hai. Ô được Tô sáng khi bạn chạm vào ô đó, sau đó Chọn khi bạn nhấc ngón tay lên. Nếu bạn chỉ ghi đè setHighlighted :, bóng sẽ xuất hiện lại khi chạm vào kết thúc.Ngay cả khi bạn chuyển sang một chế độ xem khác sau khi lựa chọn, nó đáng chú ý. – benzado

3

Sử dụng -tableView:willDisplayCell:forRowAtIndexPath:. Đó là điều cuối cùng được gọi ngay trước khi tế bào thực sự được hiển thị, vì vậy bạn có thể truy vấn thuộc tính selected của nó và đặt bóng văn bản cho phù hợp.

+2

Cảm ơn Kevin. Tôi đọc các tài liệu về điều này một khi bạn đã chỉ '-tableView: willDisplayCell: forRowAtIndexPath:' ra, và nó có vẻ như nó nên làm các trick, nhưng nó không. Tôi nghĩ '-tableView: willDisplayCell: forRowAtIndexPath:' được gọi khi ô được rút ra lần đầu tiên, và tại thời điểm một ô được chạm, nó đã được vẽ và do đó phương thức ủy nhiệm không được gọi. Tôi sẽ cập nhật câu hỏi của mình bằng mã mà tôi đã thử. Cảm ơn bạn lần nữa! –

+1

Ok, tôi nghĩ giải pháp chính xác là tạo lớp con UITableViewCell của riêng bạn và ghi đè lên '-setSelected: animated:' để điều chỉnh bóng khi cần thiết. –

3

Bạn nên ghi đè tableView:willDisplayCell:forRowAtIndexPath: và bạn cần phải thiết lập các backgroundColor-[UIColor clearColor], cũng có thể, bạn nên chỉ hành động về tình trạng được đánh dấu, trạng thái đã chọn có một ý nghĩa hơi khác nhau

2

Tôi nghĩ rằng đây là tốt hơn:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 
    [self applyLabelDropShadow:!self.highlighted]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    [self applyLabelDropShadow:!self.selected]; 
} 

Sẽ không có bóng khi thay đổi giữa các tiểu bang.