2012-10-05 27 views
7

Tôi có một ViewController với một nền gradient xuyên tâm. Bên trong đó tôi có một UITableView với các tế bào và các phần. Bây giờ tôi muốn hiển thị gradient phía sau chế độ xem bảng khi bạn cuộn. Vấn đề là khi phần khóa ở đầu bạn có thể thấy các ô phía sau phần. Tôi sẽ thiết lập màu nền phần nhưng nếu tôi làm điều đó nó không phù hợp với nền gradient xuyên tâm. Có anyway để có các tế bào clip dưới các phần trong khi vẫn giữ nền clearColor?Phần UITableView có nền clearColor?

+0

bạn có thể đăng ảnh chụp màn hình không? Có một thời gian khó hình dung điều này. –

+0

Bạn có thể đặt tableview.backgroundColor = [UIColor clearColor]; – kamleshwar

Trả lời

8

nếu tôi hiểu nó, bạn muốn có một tableview hoàn toàn rõ ràng và ô xem bảng để bạn có thể nhìn thấy nền của bộ điều khiển xem của bạn.

Bạn có thể đạt được điều này bằng cách thiết lập tableview như không có nền

tableview.backgroundColor = [UIColor clearColor]; 
tableView.opaque = NO; 
tableView.backgroundView = nil; 

và cũng là tế bào

cell.backgroundColor = [UIColor clearColor] 

nếu bạn cũng muốn phần được trong suốt, bạn có thể sử dụng phương pháp này:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

để tạo chế độ xem tùy chỉnh (ví dụ: tạo chế độ xem hình ảnh với transparen t .png cho nền)

Tôi hy vọng tôi hiểu câu hỏi của bạn một cách chính xác.


chỉnh sửa sau khi làm rõ

để cung cấp cho sự xuất hiện rằng các tế bào dừng lại trước khi đi bên dưới tiêu đề phần:

tạo ra một lớp đó là một lớp con của UITableView với Ivar này:

@interface CustomTableView : UITableView 
{ 
     CAGradientLayer* maskLayer; 
} 

rõ ràng điều này sẽ tạo ra độ dốc nhưng nếu bạn muốn, bạn có thể tinh chỉnh hoặc sử dụng CALayer và thay vì tạo mặt nạ theo chương trình, hãy tạo tệp .png với chiều rộng/chiều cao chính xác của tiêu đề phần của bạn.

ANYWAY: nếu bạn sử dụng CAGradientLayer:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) 
    { 
     [self setupGradients]; //call your method 
    } 
    return self; 
} 

- (void)setupGradients 
{ 
    [self addObserver:self forKeyPath:@"contentOffset" options:0 context:nil]; 

    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 
    //maskLayer = [[CALayer layer] retain]; 
    //maskLayer.contents = (id) [UIImage imageNamed:@"maskLayer.png"].CGImage; 
    //maskLayer.backgroundColor = [UIColor clearColor].CGColor; 
    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 

    maskLayer = [[CAGradientLayer layer] retain]; 

    CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor; 
    CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor; 

    maskLayer.colors = [NSArray arrayWithObjects:(id)outerColor, 
         (id)innerColor, (id)innerColor, (id)outerColor, nil]; 
    maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.9], 
          [NSNumber numberWithFloat:1.0], nil]; //this creates a gradient  effect. Tweak these numbers for a hard line. 

    maskLayer.bounds = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    maskLayer.anchorPoint = CGPointZero; 

    self.layer.mask = maskLayer; 
    } 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{   
    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    maskLayer.position = CGPointMake(0, self.contentOffset.y); 
    [CATransaction commit]; 
} 

sau đó trong bộ điều khiển xem của bạn:

CustomTableView *_tableView; //ivar 

    _tableView = [[CustomTableView alloc] initWithFrame:YOUR_FRAME]; 

Ý tưởng cơ bản là một chiếc mặt nạ, bạn tạo một hình dạng mặt nạ trên đỉnh của tableview của bạn có cùng kích thước với tiêu đề phần của bạn. nó sẽ xuất hiện rằng các tế bào "biến mất" đằng sau nó. Đó là một chút khó khăn, nhưng nó sẽ làm việc.

+2

Bạn đang hiểu những gì tôi đang cố gắng đạt được nhưng không phải là vấn đề tôi đang gặp phải. Vấn đề là các phần của tôi trong suốt nên bạn có thể thấy các ô khi chúng vượt qua phần sau. Điều này tạo ra một kết hợp của các tế bào và phần trông khủng khiếp. Tôi đánh giá cao câu trả lời mặc dù, nhờ – Bobbake4

+0

ah tôi hiểu bây giờ. Câu hỏi thú vị. Tôi có một ý tưởng về cách bạn có thể làm điều đó, nhưng đó là một chút hacky. Tôi sẽ chỉnh sửa câu trả lời của mình ở trên. – sixstatesaway

10

Cách đơn giản để có tiêu đề phần trong suốt mà không cần tạo chế độ xem tiêu đề của riêng bạn.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
{ 
    if ([view isKindOfClass:[UITableViewHeaderFooterView class]]) { 
     UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view; 
     headerView.contentView.backgroundColor = [UIColor clearColor]; 
     headerView.backgroundView.backgroundColor = [UIColor clearColor]; 
    } 
} 

Đoạn mã này làm việc hoàn toàn tốt đẹp trong iOS 7.

EDIT Tôi biết đây là một chút muộn, nhưng cùng với điều này, bạn cần phải thêm 2 dây chuyền đảm bảo màu nền (và màu nền của chế độ xem nền?) của uitableview cũng rõ ràng.

tableView.backgroundColor = [UIColor clearColor]; 
tableView.backgroundView.backgroundColor = [UIColor clearColor]; 
+0

Hoàn hảo! nó làm việc cho tôi. Cảm ơn nhiều –

Các vấn đề liên quan