2009-05-22 11 views
6

Tôi đang cố gắng để có được một UISegmentedControl trong một nhóm UITableViewCell giống như trong cài đặt wifi trong Ứng dụng Cài đặt. Vấn đề tôi đang gặp là tôi nhận được một đường viền đôi. Tôi nhận được một đường viền cho UISegmentedControl và một đường viền cho UITableViewCell.Vấn đề biên giới UITableViewCell/UISegmentedControl

Tôi đoán tôi cần xóa đường viền khỏi UITableViewCell. Làm thế nào tôi có thể đi về làm điều đó?

+2

Một phong cách gợi ý nhỏ: sử dụng vốn đúng đắn của tên lớp trong tiêu đề câu hỏi sẽ giúp dễ đọc hơn nhiều. Bạn có thể thay đổi nó sau khi thực tế. Rất tiếc, tôi không có câu trả lời, tôi chỉ thực hiện các ứng dụng dành cho máy tính để bàn vào lúc này. –

Trả lời

7

Tôi vừa nhận thấy điều này vẫn đang nhận được câu trả lời. Vì nó xảy ra tôi đã phải làm điều này cho một dự án khác và kể từ khi tôi hỏi câu hỏi này tôi đã học được rất nhiều thêm về dev iPhone. Đây là cách tôi giải quyết nó gần đây. Đó là tất cả về làm cho khung kích thước chính xác. Điều này nên làm điều đó cho một bảng tiêu chuẩn.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; 
if(cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease]; 

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)]; 
[cell.contentView addSubview:segmentedControl]; 
+1

@ daniel-wood: Các con số bạn đã cung cấp là đúng cho chế độ dọc, nhưng sẽ không hoạt động ở chế độ ngang. Bình chọn bạn cho điều đó :) –

+0

Ah, đúng vậy. Tôi đoán bạn có thể làm tableView.frame.size.width - 18.0f cho chiều rộng. Tất cả các giá trị khác phải giống nhau. –

1

Tôi đã có thêm một chút với điều này. Cho đến nay tôi đã phân lớp UITableViewCell. Tôi tạo ra một ngòi với một UISegmentedControl trong nó và tôi đặt nền alpha UITableViewCell đến 0. Nó vẫn không nhìn khá đúng, nhưng nó tốt hơn so với trước đây.

0

Bí quyết có vẻ là để kích thước UISegmentedControl với kích thước của backgroundView của điều khiển, không phải là contentView. Tôi đã có thể làm điều đó theo chương trình bằng cách thực hiện những điều sau đây:

// Size to cover the entire background 
    self.contentView.frame = self.backgroundView.frame; 
    self.myControl.frame = self.contentView.bounds; 

Lưu ý rằng nếu bạn đang sử dụng một phụ kiện, bạn cần vào tài khoản cho accessoryView là tốt.

Nguyên nhân là do hệ thống phân cấp xem là như sau:

  • self (các UITableViewCell hay subclass)
    • backgroundView
    • contentView
      • (điều khiển của bạn đi ở đây)
    • accessoryView

Trong bố trí chân dung, các backgroundView 'khung s là {{9, 0}, {302, 44}}, trong khi contentView' khung s là hơi nhỏ hơn, ít {{10, 1}, {300, 42}}. Điều này cung cấp cho các tế bào của nó 1px "biên giới" khi phong cách bảng được nhóm lại. Bạn phải thay đổi kích thước cả hai điều khiển của contentView để có được kích thước phù hợp.

(Chú ý:. Trong khi Apple thực sự có một số ví dụ về một UISegmentedControl trong dự án mã UICatalog mẫu trong the SDK, họ một cách hiệu quả "ăn gian" bằng cách sử dụng một UIViewController và thiết lập màu nền giao diện chính để màu nền bảng)

+0

Mã mẫu kiểm soát được phân đoạn mà bạn tham chiếu sử dụng chế độ xem chung, không phải dạng xem bảng, để hiển thị các điều khiển của nó; nó trông giống như một bảng xem bảng chỉ vì nó sử dụng màu nền đó. –

+0

Tìm hiểu và tìm ra câu trả lời đúng. Giữ một tham chiếu đến câu trả lời cũ của tôi để những người khác biết rằng ví dụ của Apple không thực sự làm điều đó. –

3

Trong trường hợp cài đặt Wi-Fi, tôi nghi ngờ những gì họ đã thực hiện được thực hiện nút "Quên mạng này", nhãn "Địa chỉ IP" và "DHCP/BootP/Static" phân đoạn kiểm soát tất cả các phần của chế độ xem tiêu đề của bảng. Nếu bạn cần làm điều này ở giữa bảng (trái ngược với ở trên cùng hoặc dưới cùng, mà bạn muốn sử dụng thuộc tính tương ứng là tableHeaderViewtableFooterView), tôi khuyên bạn nên sử dụng phương thức ủy nhiệm -tableView:viewForHeaderInSection: với -tableView:heightForHeaderInSection hoặc tương ứng Footer biến thể. Với bất kỳ thứ gì trong số đó, bạn sẽ thiết lập chế độ xem tùy chỉnh cho "phần" đó của chế độ xem bảng của bạn (sử dụng màu nền rõ ràng hoặc [UIColor groupTableBackgroundColor]), chứa nhãn và điều khiển phân đoạn được sắp xếp sao cho chúng khớp với phần còn lại của các phần bảng.

2

Sử dụng kỹ thuật trong this post để loại bỏ các opacity nền của UITableViewCell làm việc dễ dàng hơn cho tôi để có được chỉ UISegmentedControl để hiển thị trong dòng của bảng.

+0

Đây là cách phù hợp để làm điều đó - làm cho khung của điều khiển giống như 'cell.contentView.bounds', đặt' autoresizingMask' thành 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight', thêm điều khiển dưới dạng subview của 'cell.contentView' và đặt' cell.backgroundView' thành 'UIView' trong suốt. –

1

Giải pháp của tôi là cho phép điều khiển được phân đoạn thay đổi kích thước cho vừa và để ẩn nền của chế độ xem bảng trong tableView:willDisplayCell:forRowAtIndexPath:.

này mang lại kết quả giống với "Settings.app> WiFi> Mạng của bạn> IP Address" phân đoạn kiểm soát mà không cứng mã hóa bất kỳ số liệu bố trí:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]]; 
    control.segmentedControlStyle = UISegmentedControlStylePlain; 
    control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    control.frame = cell.contentView.bounds; 
    [cell.contentView addSubview:control]; 
    [control release]; 
} 

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.backgroundView.alpha = 0.0; 
}