2013-09-25 34 views
15

Tôi đang tạo UITableView với tùy chỉnh UITableViewCell s. Nút xóa mới của iOS 7 đang gây ra một số vấn đề với bố cục ô của tôi.Nút xóa chồng chéo nội dung UITableViewCell khi ở chế độ chỉnh sửa trong iOS7

Nếu tôi sử dụng nút "Chỉnh sửa", làm cho các vòng tròn màu đỏ xuất hiện, tôi sẽ gặp sự cố, nhưng nếu tôi vuốt một ô đơn lẻ thì sẽ hoàn hảo.

Đây là khi nút Edit được sử dụng:

[self.tableView setEditing:!self.tableView.editing animated:YES]; 

Content overlaps the delete button

Đây là khi tôi vuốt một tế bào duy nhất:

Content is placed right

Như bạn có thể se nhãn của tôi chồng chéo de nút lete trong ví dụ đầu tiên. Tại sao nó làm điều này và làm thế nào tôi có thể sửa chữa nó?

+0

bản sao có thể có của [nút xóa UITableViewCell được che đậy] [http://stackoverflow.com/questions/18938719/uitableviewcell-delete-button-gets-covered-up) – dtmland

Trả lời

7

thử sử dụng các thuộc tính accessoryVieweditingAccessoryView của UITableViewCell, thay vì tự thêm chế độ xem.

Nếu bạn muốn cùng một chỉ số được hiển thị trong cả hai chỉnh sửa và không chỉnh sửa chế độ, hãy thử cài đặt cả hai thuộc tính nhằm trỏ vào quan điểm tương tự trong của bạn uiTableViewCell như:

self.accessoryView = self.imgPushEnabled; 
self.editingAccessoryView = self.imgPushEnabled; 

Dường như có một trục trặc trong hoạt động chỉnh sửa bảng trong IOS7, cho phép chồng chéo nút xóa và accessoryView khi chuyển về trạng thái không chỉnh sửa. Điều này dường như xảy ra khi số accesoryView được chỉ định và editingAccessoryViewnil.

Có thể chỉnh lại trục trặc này, dường như được quy định cụ thể một editingAccessoryView vô hình như:

self.editingAccessoryView =[[UIView alloc] init]; 
self.editingAccessoryView.backgroundColor = [UIColor clearColor]; 
+0

Tôi không nhận được "nếu bạn muốn cùng một chỉ báo "và điều này dường như không giải quyết được vấn đề cho tôi. – tcurdt

+0

@tcurdt. Tôi chỉ cần chỉnh sửa bằng câu trả lời. – EsbenB

+0

Nhưng đây không phải là hiển thị cùng một chỉ báo.Đó là về cách bố trí của ô. Hoặc nút xóa quá lớn khi có chỉ báo xóa. – tcurdt

1

Cách tốt nhất để loại bỏ vấn đề này là thêm một hình ảnh trong phòng giam và đặt nó ở mặt sau.

 UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]]; 
     imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height); 
     [yourCustomCell addSubview:imageView]; 
     [yourCustomCell sendSubviewToBack:imageView]; 

Nếu văn bản của bạn sẽ chồng lên nút xóa thì hãy thực hiện Tự động hoàn thành. Nó sẽ quản lý nó theo cách tốt hơn.

Một trường hợp khác có thể được tạo là cellSelectionStyle sẽ đánh dấu bằng màu mặc định. Bạn có thể đặt màu đánh dấu như sau

 yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone; 

Đặt kiểu chọn của ô trong bảng thành UITableViewCellSelectionStyleNone. Điều này sẽ loại bỏ đánh dấu nền màu xanh hoặc khác. Sau đó, để làm cho nhãn văn bản hoặc contentview làm nổi bật theo cách bạn muốn, hãy sử dụng phương thức này trong lớp yourCustomCell.m.

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

Tôi hy vọng bạn hiểu điều đó một cách tốt hơn.

+0

Làm thế nào có nghĩa vụ phải giúp đỡ !? – tcurdt

+0

Xin chào @tcurdt, nếu bạn thêm hình ảnh ở dưới nền của ô và sau đó đặt nó qua phương thức sendSubviewToBack, nó sẽ dừng trùng lặp. Và nếu bạn áp dụng phương thức setHighlighted trong lớp customCell của bạn thì nó sẽ giúp bạn thiết lập màu được tô sáng của ô. – chandan

+0

Làm cách nào để thêm màu liên quan? Đây không phải là về màu sắc nổi bật. Tại sao nên thêm hình ảnh vào nền của ô để sửa bố cục (hoặc cuộn chế độ xem cuộn của ô). Xin lỗi - vẫn không hiểu. – tcurdt

3

Vấn đề là ở chế độ chỉnh sửa, contentView của ô sẽ thay đổi về kích thước.Vì vậy, hoặc là bạn phải ghi đè layoutSubviews trong di động của bạn và hỗ trợ các khung khác nhau kích cỡ

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 
    CGRect contentFrame = self.contentView.frame; 
    // adjust to the contentView frame 
    ... 
} 

hoặc bạn lấy mồi và chuyển sang autolayout.

Đầu tiên tôi nghĩ rằng thiết lập contentView.clipsToBounds đến YES có thể là một giải pháp xấu xí nhưng điều đó dường như không hoạt động.

+0

Tôi đã sử dụng self.bounds (không thay đổi) thay vì self.contentView.frame. Cảm ơn bạn! – ansible

0

Hãy thử điều này: Có thể bạn đang thiết lập tập hợp tế bàoBackgroundImage trong cellForRowAtIndexPath (Phương thức ủy quyền). Không đặt ở đây. Đặt hình ảnh của bạn ở:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]]; } 

Tận hưởng mã hóa.

4

Tôi đã giải quyết vấn đề này với thiết lập các ràng buộc mà không chiều rộng chỉ ở đầu và đuôi

+0

Bạn có thể cụ thể không, tôi có chính xác cùng một vấn đề trong iOS7 – Nostradamus

+0

Tôi đã có lượt xem tiếp theo: cell - contentView - backgroundImageView; –

+0

Tôi có ngăn xếp lượt xem tiếp theo: cell - contentView - backgroundImageView; khi tôi thiết lập các ràng buộc cho backgroundImageView như: leading = 0; top = 0; height = someHeight; width = someWidth; sau đó deleteButton đã được hiển thị dưới backgroundImageView. Tôi đã thay đổi chiều rộng ràng buộc thành dấu. BackgroundImageView bắt đầu thay đổi kích thước và deleteButton đang hiển thị đầy đủ –

2

Như tcurdt đề cập, bạn có thể chuyển sang autolayout để giải quyết vấn đề này. Nhưng, nếu bạn (dễ hiểu) không muốn gây rối với autolayout chỉ cho một ví dụ này, bạn có thể thiết lập autoresizingMask và tự động biến nó thành các ràng buộc autolayout thích hợp.

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
2

Chỉ cần sử dụng phương pháp này trong tùy chỉnh TableViewCell lớp của bạn, bạn có thể nhận được câu trả lời hoàn hảo,

Đây selfUITableviewCell

- (void)layoutSubviews { 

[super layoutSubviews]; 

    for (UIView *subview in self.subviews) { 

    for (UIView *subview2 in subview.subviews) { 

     if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view 

      [subview bringSubviewToFront:subview2]; 

     } 
    } 
    } 
} 
+0

không hoạt động với ios 7.1.2;) – yatanadam

1

Đưa ra trước UITableViewCellDeleteConfirmationView trong layoutSubviews công trình tế bào tùy chỉnh cho tôi trên iPhone, nhưng không phải trên iPad.

Tôi có một UITableView ở phần tổng thể của một splitViewController cho iPad, và trong trường hợp này khung của UITableViewCellDeleteConfirmationView là (768 0; 89 44), thay vì (320 0; 89 44)

vì vậy, tôi thay đổi kích thước khung hình trong phương pháp layoutSubviews và các công trình này cho tôi

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    for (UIView *subview in self.subviews) 
    { 
     for (UIView *subview2 in subview.subviews) 
     { 
      if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) 
      { 
       CGRect frame = subview2.frame; 
       frame.origin.x = 320; 
       subview2.frame = frame; 
       [subview bringSubviewToFront:subview2]; 
      } 
     } 
    } 
} 
2

và nếu có ai muốn điều chỉnh Kích nút Delete, Sử dụng Bộ luật sau

- (void)layoutSubviews { 

    [super layoutSubviews]; 

    for (UIView *subview in self.subviews) { 

     for (UIView *subview2 in subview.subviews) { 

      if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view 

       CGRect rect = subview2.frame; 
       rect.size.height = 47; //adjusting the view height 
       subview2.frame = rect; 

       for (UIButton *btn in [subview2 subviews]) { 

        if ([NSStringFromClass([btn class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) { // adjusting the Button height 
         rect = btn.frame; 
         rect.size.height = CGRectGetHeight(subview2.frame); 
         btn.frame = rect; 

         break; 
        } 
       } 

       [subview bringSubviewToFront:subview2]; 

      } 
     } 
    } 
} 
0

Giải pháp của tôi là để di chuyển toàn bộ contentView sang trái khi Xóa nút hiển thị:

override func layoutSubviews() { 
    super.layoutSubviews() 

    if editingStyle == UITableViewCellEditingStyle.Delete { 
     var rect = contentView.frame 
     rect.origin.x = self.showingDeleteConfirmation ? -15 : 38 
     contentView.frame = rect 
    } 
} 
1

Nếu bạn đang đặt nội dung trong contentView của UITableViewCell, hãy chắc chắn bạn sử dụng self.contentView.frame.size.width và không self.frame.size.width trong layoutSubviews.

self.frame mở rộng chiều rộng trong chế độ chỉnh sửa và sẽ khiến mọi nội dung ở bên phải mở rộng quá giới hạn của contentView. self.contentView.frame vẫn ở đúng chiều rộng (và là những gì bạn nên sử dụng).

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