2011-10-04 18 views
8

Tôi đã thất vọng với câu hỏi này trong một vài ngày. Tôi đang cố gắng thêm một UILabel vào một UITableViewCell. Tôi muốn UILabel kéo dài toàn bộ chiều rộng của ô, trừ 5 hoặc 10 ở cả hai bên phải và bên trái cho giao diện. Vấn đề của tôi là lập trình xác định kích thước của khung của ô để đặt nhãn. Không có vấn đề gì mà UITableViewStyle tôi sử dụng, giá trị cell.contentVew.frame.size.width là hư không gần chiều rộng của khung tế bào.Truy xuất khung UITableViewCell

Ví dụ, trong bảng Tôi đang xây dựng, tôi có thể đạt được kết quả mong muốn của tôi bởi subclassing UITableViewCell và tạo ra một UILabel có chiều rộng xác định bằng tay (thông qua chỉ thử và sai) bằng cách:

CGRectMake(10, 12, 397, self.contentView.frame.size.height); 

Nhưng nó con số 397 làm tôi thất vọng. Tôi muốn một cách để lập trình xác định những gì nó nên được cho bất kỳ bảng chiều rộng hoặc phong cách. Đây sẽ là một quá trình đơn giản bởi chỉ cần xác định chiều rộng của toàn bộ khung của ô và sau đó trừ 10 hoặc 20 để các cạnh của UILabel không thực sự chạm vào cạnh của ô.

Tuy nhiên, nếu tôi đặt tableViewStyle để UITableViewStyleDefault và sau đó thử:

NSLog(@"Width: %f", self.contentView.frame.size.width); 

tôi nhận được 320. Nếu tôi đặt phong cách cho bất kỳ trong ba phong cách khác, số lượng trả lại là 302. Ngay cả 320 số không phải là bất cứ nơi nào gần chiều rộng của khung tế bào (như với số được xác định bằng tay của tôi là 397).

Giá trị nào tôi cần truy cập sẽ trả về toàn bộ chiều rộng của khung vẽ của ô? Tôi chắc chắn, như với hầu hết các vấn đề gây khó chịu, giải pháp sẽ khiến tôi muốn tát vào trán, nhưng tôi đến mức tôi sẵn sàng cho nó ngay bây giờ.

CHỈNH SỬA để biết thêm thông tin:

Làm rõ cho bất kỳ ai quan tâm. Câu hỏi này của tôi liên quan chủ yếu đến một bảng kiểu được nhóm. Đối với một phong cách đơn giản, câu trả lời cho câu hỏi của tôi ở trên có thể được xác định đơn giản trong phương pháp cellForRowAtIndexPath bởi:

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width; 

Vấn đề tôi đang gặp là phương pháp rectForRowAtIndexPath trả về chiều rộng của khung trong đó các tế bào là rút ra, đó là tốt cho một bảng phong cách đơn giản kể từ khi chiều rộng tế bào là toàn bộ chiều rộng của khung. Tuy nhiên, trong một bảng được nhóm, chiều rộng của ô nhỏ hơn chiều rộng của khung mà nó được vẽ, vì vậy phương thức này sẽ trả lại một số rộng hơn một chút so với chiều rộng của ô. Có thể chiều rộng của ô trong kiểu bảng được nhóm là một số cố định nhỏ hơn chiều rộng của khung bảng, vì vậy đây có thể là cách để giải quyết vấn đề. Tôi sẽ điều tra và trả lời câu hỏi của riêng tôi ở đây nếu đó là trường hợp.

+0

Câu hỏi hay Tôi nhận được hành vi giống hệt nhau và điều đó khiến tôi phát điên. Cách giải quyết của tôi là không suy nghĩ về kích thước khung hình và chỉ đề cập đến chiều rộng của phần xem phụ theo tỷ lệ phần trăm của kích thước chế độ xem nội dung.Tôi khá chắc chắn khung nhìn nội dung không bao gồm các khu vực bên trái và bên phải của ô dành riêng cho các phụ kiện (di chuyển, xóa, tiết lộ, v.v.) nhưng vẫn không trả lời được vấn đề tại sao khung ô luôn báo cáo kích thước sai . Hy vọng rằng ai đó sẽ đến và làm cho tinh thần của tất cả những điều này. – Rog

+0

Đây có phải là cảnh quan không? –

+0

@Bartosz - Trong ví dụ của tôi, tôi nhận được số từ chân dung. – Chris

Trả lời

8

Tôi đã xác định câu trả lời của riêng mình và tôi hy vọng nó sẽ giúp mọi người gặp phải vấn đề tương tự. Việc tính toán lợi nhuận của một bảng được xem nhóm mà tôi tìm thấy trên this StackOverflow answer.

Mã này sẽ cung cấp một ô nằm giữa hai cạnh của ô và căn giữa theo chiều dọc trong ô.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *label; 
    CGFloat groupedStyleMarginWidth, tableViewWidth; 
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like 
    NSString *labelText = @"Test String"; 

    // Calculate the margin between the cell frame and the tableView 
    // frame in a grouped table view style. 
    tableViewWidth = tableView.frame.size.width; 
    if (tableView.style == UITableViewStyleGrouped) { 
     if (tableViewWidth > 20) 
      groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06)); 
     else 
      groupedStyleMarginWidth = tableViewWidth - 10; 
    } 
    else 
     groupedStyleMarginWidth = 0.0; 

    if (cell == nil) { 
     CGRect tableViewRect; 
     CGRect labelRect; 
     CGFloat x, y, w, h, labelMargin; 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // Retrieve the rect of the table view. 
     tableViewRect = [tableView rectForRowAtIndexPath:indexPath]; 

     // Set whatever margin around the label you prefer. 
     labelMargin = 10; 

     // Determine rect values for the label. 
     x = tableRect.origin.x + labelMargin; 

     // Calculate width of label 
     w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2); 

     // Calculate height of table based on font set earlier. 
     h = [labelText sizeWithFont:font].height; 

     // Calculate y position for the label text baseline to center 
     // vertically within the cell. 
     y = (tableRect.origin.y/2) - (h/4); 

     labelRect = CGRectMake(x, y, w, h); 

     label = [[UILabel alloc] initWithFrame:labelRect]; 
     label.text = labelText; 
     label.tag = 0; 
     [cell.contentView addSubview:stepLabel]; 
     [label release]; 
    } 
    else { 
     label = (UILabel *)[cell viewWithTag:0]; 
    } 
1

Âm thanh như thế này sẽ được xử lý tốt nhất bởi ràng buộc bố cục tự động hiện nay.

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