Cách đặt chiều rộng của ô trong UITableView theo kiểu nhóm


107

Tôi đã làm việc này trong khoảng 2 ngày, vì vậy tôi nghĩ rằng tôi sẽ chia sẻ những kiến ​​thức của mình với bạn.

Câu hỏi đặt ra là: Có thể làm cho chiều rộng của ô trong UITableView được nhóm nhỏ hơn không?

Câu trả lời là không.

Nhưng có hai cách bạn có thể giải quyết vấn đề này.

Giải pháp # 1: Một bảng mỏng hơn Có thể thay đổi khung của tableView để bảng nhỏ hơn. Điều này sẽ dẫn đến việc UITableView hiển thị ô bên trong với chiều rộng giảm.

Một giải pháp cho điều này có thể trông như thế này:

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

Giải pháp # 2: Có các ô được hiển thị bởi hình ảnh

Giải pháp này được mô tả tại đây: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

Tôi hy vọng thông tin này là hữu ích cho bạn. Tôi đã mất khoảng 2 ngày để thử rất nhiều khả năng. Đây là những gì còn lại.


3
Tôi nghĩ điều này lẽ ra nên được đặt thành một câu hỏi chỉ với dòng thứ hai ("Câu hỏi là: ..."), thì Giải pháp số 1 và Giải pháp số 2 được đăng dưới dạng hai câu trả lời riêng biệt, với một trong số chúng được chấp nhận. Sau đó, nếu những người dùng khác thêm câu trả lời của riêng họ và một trong số họ kết thúc tốt hơn, câu trả lời được chấp nhận có thể được thay đổi sau đó.
GeneralMike

Câu trả lời:


226

Cách tốt hơn và rõ ràng hơn để đạt được điều này là phân lớp UITableViewCell và ghi đè -setFrame:phương thức của nó như sau:

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

Tại sao nó tốt hơn? Vì hai cái kia tệ hơn.

  1. Điều chỉnh chiều rộng chế độ xem bảng trong -viewWillAppear:

    Trước hết, điều này là không đáng tin cậy, bộ điều khiển chế độ xem siêu cấp hoặc chế độ xem phụ huynh có thể điều chỉnh khung xem bảng thêm sau khi -viewWillAppear:được gọi. Tất nhiên, bạn có thể phân lớp con và ghi đè -setFrame:cho UITableView của mình giống như những gì tôi làm ở đây cho UITableViewCells. Tuy nhiên, phân lớp con UITableViewCells là một cách phổ biến, nhẹ nhàng và của Apple.

    Thứ hai, nếu UITableView của bạn có backgroundView, bạn không muốn backgroundView của nó bị thu hẹp lại với nhau. Giữ chiều rộng backgroundView trong khi thu hẹp chiều rộng UITableView không phải là công việc tầm thường, chưa kể đến việc mở rộng các chế độ xem phụ ra ngoài chế độ xem siêu cao của nó không phải là một việc rất thanh lịch ngay từ đầu.

  2. Kết xuất ô tùy chỉnh để giả mạo chiều rộng hẹp hơn

    Để làm điều này, bạn phải chuẩn bị các hình nền đặc biệt có lề ngang và bạn phải tự mình bố trí các ô xem phụ để phù hợp với lề. Trong khi đó, nếu bạn chỉ cần điều chỉnh độ rộng của toàn ô, thì tự động lưu trữ sẽ thực hiện tất cả các công việc cho bạn.


2
đây là một giải pháp tốt đẹp và thanh lịch, tôi đã làm nó trong một thể loại :) Tôi cũng lưu ý rằng các đối tượng minh bạch hơn, càng có nhiều tải cpu :)
mister Koz

11
@misterkoz - một lời cảnh báo: Một số điều khiển iOS (xác định là UIDatePicker) sử dụng nội bộ UITableViewCells và phá vỡ nếu bạn triển khai điều này trong một danh mục.
Clafou 21/07/12

7
Phương pháp này dường như không hoạt động trong iOS8 khi cố gắng xóa một ô ở chế độ chỉnh sửa. SetFrame được gọi khi bạn vào / thoát chế độ chỉnh sửa, do đó ô tiếp tục bị thu hẹp. Bất kỳ giải pháp cho điều này?
John Baum

3
@JohnBaum này có thể giúp (ít nhất là trong trường hợp của tôi nó hoạt động): stackoverflow.com/questions/25911484/ios-8-cell-resizing/...
HashtagMarkus

2
Giải pháp này thực sự là của trời cho. Trong trường hợp ai đó đang tự hỏi làm thế nào để làm điều tương tự trong nhanh chóng - reddit.com/r/swift/comments/2fr849/...
sysuser

16

Để thực hiện điều này trong Swift, vốn không cung cấp các phương thức để đặt biến, bạn sẽ phải ghi đè bộ cài đặt cho frame. Ban đầu được đăng (ít nhất là nơi tôi tìm thấy nó) ở đây

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}

Làm việc nhanh chóng
Simon McNeil

9

Nếu không có gì hiệu quả, bạn có thể thử cái này

Làm cho màu nền của ô là màu trong và sau đó đặt một hình ảnh của ô với kích thước cần thiết. Nếu bạn muốn hiển thị một số văn bản trên ô đó, hãy đặt nhãn phía trên hình ảnh. Đừng quên đặt màu nền của nhãn thành màu rõ ràng.


8

Tôi thấy giải pháp được chấp nhận không hoạt động khi xoay vòng. Để đạt được UITableViewCells với chiều rộng cố định và lợi nhuận linh hoạt, tôi chỉ điều chỉnh giải pháp trên theo như sau:

- (void)setFrame:(CGRect)frame {

    if (self.superview) {
        float cellWidth = 500.0;
        frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
        frame.size.width = cellWidth;
    }

    [super setFrame:frame];
}

Phương thức được gọi bất cứ khi nào thiết bị xoay, vì vậy các ô sẽ luôn được căn giữa.


0

Có một phương thức được gọi khi màn hình được xoay: viewWillTransitionToSize

Đây là nơi bạn nên thay đổi kích thước khung hình. Xem ví dụ. Thay đổi coords khung khi bạn cần.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}

-2

tôi làm điều đó trong

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
    CGFloat tableBorderRight = self.view.frame.size.width - 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect;
}

Và điều này đã làm việc cho tôi


-6

Trong tệp .h, hãy thêm đại biểu 'UITableViewDataSource'

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}

4
Ông muốn thiết lập chiều rộng, không phải là chiều cao
Christopher Pickslay

oh hoo. sry vì sự bất tiện.
Bharath gangupalli

u hiểu sai câu hỏi và u trả lời cho chiều cao và bạn biết những gì làm việc của nó đối với tôi, vì tôi đang tìm kiếm chiều cao không cho width..thanks cho câu trả lời
Pooja
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.