2008-11-04 27 views
35

Tôi đang phát triển một ứng dụng iPhone, theo quan điểm của tôi, tôi muốn bảng màu tùy chỉnh cho Selection Cell Style, tôi đọc UITableViewCell Lớp Reference nhưng chỉ có ba hằng số định nghĩa cho Selection phong cách (Xanh lam, Xám, Không). Tôi thấy một ứng dụng sử dụng một màu khác với màu được xác định trong tham chiếu.Làm cách nào để đặt thuộc tính UITableViewCellSelectionStyle thành một số màu tùy chỉnh?

Làm thế nào chúng ta có thể sử dụng một màu sắc khác so với những quy định trong tài liệu tham khảo?

Xin cảm ơn trước.

+0

Tôi rất muốn giới thiệu phương pháp tiếp cận của Matt Gallagher đối với phương pháp mà bạn đã chấp nhận! Hãy xem xét cho nó một cái nhìn nếu bạn chưa có. –

+0

Câu trả lời trong bài đăng này rất lộn xộn. Mọi người vui lòng bỏ qua những người được xếp hạng cao nhất và bỏ phiếu cho các câu trả lời chính xác thực sự, ở dưới cùng. – bentford

Trả lời

64

Cách tốt nhất để thiết lập các lựa chọn là để thiết lập selectedBackgroundView trên di động khi bạn xây dựng nó.

ví dụ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease]; 
    } 

    // configure the cell 
} 

Hình ảnh sử dụng nên có một gradient đẹp (như lựa chọn mặc định). Nếu bạn chỉ muốn một màu phẳng, bạn có thể sử dụng UIView thay vì UIImageView và đặt backgroundColor thành màu bạn muốn.

Nền này sau đó được tự động áp dụng khi hàng được chọn.

+5

Điều gì về chế độ xem bảng kiểu được nhóm? Tôi chỉ sử dụng một hình ảnh hình chữ nhật và nó cho thấy thông qua các đường cong tròn của các ô xem bảng. +1 để có câu trả lời tuyệt vời. – JoePasq

+3

Đối với các ô xem bảng được nhóm, bạn cần 4 hình nền - trên cùng, dưới cùng, giữa và trên cùng và dưới cùng và bạn cần áp dụng chúng dựa vào vị trí ô trong nhóm. –

+0

Bạn không thể làm điều này mà không cần sử dụng hình ảnh? –

2

Override didSelectRowAtIndexPath: và vẽ một UIView của một màu sắc lựa chọn của bạn và chèn nó đằng sau UILabel bên trong tế bào. Tôi sẽ làm điều này như sau:

UIView* selectedView; //inside your header 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; 
    selectedView = [[UIView alloc] initWithFrame:[cell frame]]; 
    selectedView.backgroundColor = [UIColor greenColor]; //whatever 

    [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary 
    [selectedView release]; //clean up 

} 

Bạn có thể chọn tạo hiệu ứng này khi không được chọn và sẽ thỏa mãn yêu cầu của bạn.

+8

Cách tiếp cận này tránh tích hợp sẵn trong Background được chọn của Apple trên mọi UITableViewCell. Nếu bạn sử dụng tùy chọnBackgroundView đã chọn, lựa chọn của bạn sẽ hoạt ảnh trong và ngoài và cũng sẽ không được chọn khi được hướng dẫn. –

+1

Sẽ tốt hơn nếu ghi đè lên 'setSelected: highlight:' trong ô và làm logic ở đó nếu bạn định thực hiện phương pháp này để nó hoạt động trong tất cả các bộ điều khiển xem. Như Matt đã nói, việc sử dụng 'selectedBackgroundView' là một cách tiếp cận tốt hơn nhiều. –

+0

+1 Câu trả lời hay, mặc dù một chút hacky. Không phải là một điều xấu! – bentford

24

Đặt selectedBackgroundView dường như không có tác dụng khi cell.selectionStyle được đặt thành UITableViewCellSelectionStyleNone. Khi tôi không đặt kiểu chỉ sử dụng màu xám mặc định.

Sử dụng đề xuất đầu tiên chèn tùy chỉnh UIView vào ô sẽ thao tác ô nhưng không hiển thị khi ô được chạm, chỉ sau khi hành động được chọn hoàn tất quá muộn vì tôi đang đẩy một cái nhìn mới. Làm cách nào để có được chế độ xem được chọn trong ô để hiển thị trước khi bắt đầu thao tác đã chọn?

+1

Điều này cần thêm nhiều phiếu bầu. – freespace

+4

Điều này là chính xác. Tôi cần đặt selectionStyle thành Blur hoặc Gray. Không có gì sẽ làm cho nó không hoạt động. Dù sao bạn có thể làm điều này bằng cách ghi đè phương thức '-setHighlited: animated:' của lớp 'UITableViewCell'. – Eonil

+1

-1 Đây phải là nhận xét. – bentford

7

Tôi đã thử một số điều trên, và Tôi thực sự thích tạo lớp con của riêng mình của UITableViewCell và sau đó ghi đè các chạm chạmBegan/touchesCộng đồng/chạm Phương thức được sử dụng. Để thực hiện điều này, bỏ qua tất cả các thuộc tính đã chọnBackgroundView và highlightColor được chọn trên ô và thay vào đó, chỉ cần đặt các màu này theo cách thủ công bất cứ khi nào một trong các phương thức trên được gọi. Ví dụ, nếu bạn muốn thiết lập các tế bào để có một nền màu xanh lá cây với văn bản màu đỏ, hãy thử này (trong lớp tế bào tùy chỉnh của bạn):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    //Set backgorund 
    self.backgroundColor = [UIColor themeBlue]; 

    //Set text 
    self.textLabel.textColor = [UIColor themeWhite]; 

    //Call super 
    [super touchesBegan:touches withEvent:event]; 
} 

Lưu ý rằng để làm việc này, bạn cần phải thiết lập:

self.selectionStyle = UITableViewCellSelectionStyleNone; 

Nếu không, trước tiên bạn sẽ nhận được phong cách lựa chọn hiện tại.

EDIT: Tôi khuyên bạn nên sử dụng phương pháp touchesCancelled để hoàn nguyên về màu gốc của ô, nhưng chỉ cần bỏ qua phương thức touchesEnded.

+0

+1 Câu trả lời hay! – bentford

12

Nếu bạn đã subclassed một UITableViewCell, sau đó bạn có thể tùy chỉnh các yếu tố khác nhau của tế bào bằng cách ghi đè sau:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

EDIT cho iOS7: như Sasho nói, bạn cũng cần

cell.selectionStyle = UITableViewCellSelectionStyleNone 
+0

+1 Câu trả lời hay, điều này giải quyết được vấn đề của tôi. Cảm ơn! – bentford

+0

Trong iOS 7 giải pháp trên làm việc kết hợp với "cell. SelectionStyle = UITableViewCellSelectionStyleNone". – Sasho

1

Sublcass UITableViewCell và ghi đè setHighlighted:animated:

Bạn có thể xác định màu tùy chọn màu bằng cách đặt các backgroundColor (xem câu trả lời WIllster của):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted) { 
     self.backgroundColor = [UIColor redColor]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 

    [super setHighlighted:highlighted animated:animated]; 
} 

Bạn có thể xác định một hình nền tùy chỉnh bằng cách thiết lập thuộc tính backgroundView:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    if(highlighted == YES) 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]]; 
    else 
     self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]]; 


    [super setHighlighted:highlighted animated:animated]; 
} 
0
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
// Set Highlighted Color 
if (highlighted) { 
self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f]; 
    } else { 
     self.backgroundColor = [UIColor clearColor]; 
    } 
} 
+0

UITableViewCell có phương pháp để đặt màu trạng thái được tô sáng Ở đây, mã spinnet // animate giữa trạng thái thông thường và được đánh dấu – PK86

0
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Add your Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //highlight colour 
} 

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Reset Colour. 
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; 
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color 

} 

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell { 
    cell.contentView.backgroundColor = color; 
    cell.backgroundColor = color; 
} 
0

Để thêm màu sắc tùy chỉnh sử dụng mã dưới đây . Và để làm cho nó minh bạch sử dụng alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero) 
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0) 

Nếu bạn sử dụng màu sắc tùy chỉnh và muốn để cho nó làm tròn góc nhìn sử dụng:

cell.layer.cornerRadius = 8 

Ngoài ra, sử dụng cho các hình ảnh động tốt hơn và cảm thấy

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    tableView.deselectRow(at: indexPath, animated: true) 
} 
Các vấn đề liên quan