2011-02-02 38 views
30

Tôi muốn căn giữa tiêu đề trên bảng nhìn, tuy nhiên tôi có 2 vấn đề. Đầu tiên tôi không có chiều cao chính xác và thứ hai UILabel không giống như tiêu đề mặc định - font/font size/color etc ... Có cách nào tốt hơn để căn giữa nó không, và/hoặc có cách nào để làm nó trông giống như tiêu đề mặc định.Cách căn giữa tiêu đề phần của UITableView

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section 
{ 
    //section text as a label 
    UILabel *lbl = [[UILabel alloc] init]; 
    lbl.textAlignment = UITextAlignmentCenter; 

    lbl.text = @"Header"; 
    [lbl setBackgroundColor:[UIColor clearColor]]; 

    return lbl; 
} 

Trả lời

22

Bạn cũng phải thực hiện tableView: heightForHeaderInSection để điều chỉnh chiều cao tiêu đề của bạn:

Trong doc UITableViewDelegate chiếu giao thức bạn tìm thấy:

tableView: viewForHeaderInSection:

Thảo luận

Đối tượng được trả về, ví dụ: có thể là đối tượng UILabel hoặc UIImageView. Chế độ xem bảng tự động điều chỉnh chiều cao của tiêu đề mục đến chứa đối tượng chế độ xem được trả lại. Phương pháp này chỉ hoạt động chính xác khi tableView: heightForHeaderInSection: is cũng được triển khai.

Để căn giữa nhãn Tiêu đề, bạn phải chỉ định khung nhãn trước khi thiết lập hình chữ nhật thành tâm. Để nhận được font standart, sử dụng SystemFontOfSize:

Cũng hãy cẩn thận bạn đang tạo một bộ nhớ bị rò rỉ bạn có nghĩa vụ phải trả lại một cái nhìn autoreleased

Hãy thử một cái gì đó như thế này:

UILabel *lbl = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 30)] autorelease]; 
lbl.textAlignment = UITextAlignmentCenter; 
lbl.font = [UIFont systemFontOfSize:12]; 

Hy vọng điều này giúp, Vincent

+0

Cảm ơn, nhưng tôi vẫn cần phải tìm kích thước font chữ, chiều cao nhãn, vv của tiêu đề mặc định thực tế để thiết lập nó như trên .... Tôi không muốn thay đổi bất cứ điều gì từ tiêu đề mặc định, ngoại trừ sự liên kết trung tâm. Sự liên kết bên trái trông rất tệ cho những gì tôi đang làm. – Mark

+0

Tôi đã chấp nhận câu trả lời này vì nó rất hữu ích và tôi đã quyết định không sử dụng phông chữ tiêu đề mặc định của điện thoại và sử dụng phông chữ của riêng tôi thay thế. – Mark

+0

phải là self.view.frame.size.width trong CGRectMake (0, 0, self.view.frame.width, 30) – Stan

-4

Để thay đổi chiều cao, hãy thực hiện phương pháp này:

- (UIView *)tableView:(UITableView *)tableView 
viewForHeaderInSection:(NSInteger)section { return 15; }

Tôi không thực sự chắc chắn về điều đầu trang mặc định - điều đó phải dễ hơn thế. Có thể ai đó có hình nền đẹp mà bạn có thể sử dụng với phông chữ màu trắng. Nhưng đối với những điều trung, hãy thử này:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,15)]; 
label.textAlignment = UITextAlignmentCenter 

label.text = @"Text Should Be Centered"; 
+0

Tôi nghĩ bạn cần kiểm tra mã trước khi gửi! Hàm '-viewForHeaderInSection' trả về UIView và không thể trả về 15. –

+0

@HamedRajabi Tôi nghĩ rằng có lẽ tôi muốn trả lại giá trị 15 cho bất kỳ phương thức chiều cao nào được gọi là: P –

1

Hãy thử điều này

UILabel *tableHeader = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; 
[tableHeader setText:@"This is header"]; 
[tableHeader setTextAlignment:UITextAlignmentCenter]; 

UITableView *newTable = [[UITableView alloc] initWithFrame:CGRectMake(20, 0, 280, 200) style:UITableViewStylePlain]; 
[newTable setBackgroundColor:[UIColor clearColor]]; 
[newTable setTableHeaderView:tableHeader]; 
self.view = newTable; 
5

Dưới đây là phiên bản của tôi, bạn sẽ cần phải thực hiện một ảnh chụp màn hình của nền tiêu đề bình thường, và lưu một lát rộng 1px của nó là 'my_head_bg.png' và thêm nó vào dự án. Bằng cách này, nó sẽ trông hoàn toàn bình thường:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UILabel *lbl = [[[UILabel alloc] init] autorelease]; 
    lbl.textAlignment = UITextAlignmentCenter; 
    lbl.font = [UIFont fontWithName:@"Helvetica-Bold" size:18]; 
    lbl.text = @"My Centered Header"; 
    lbl.textColor = [UIColor whiteColor]; 
    lbl.shadowColor = [UIColor grayColor]; 
    lbl.shadowOffset = CGSizeMake(0,1); 
    lbl.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"my_head_bg"]]; 
    lbl.alpha = 0.9; 
    return lbl; 
} 
26

điều này sẽ giải quyết được vấn đề của bạn. Thử nghiệm trong xcode 6/iOS8

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    [[UILabel appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setTextAlignment:NSTextAlignmentCenter]; 
    return [sectionTitles objectAtIndex:section]; 
} 
+0

Điều này rất hữu ích. Trước đây tôi chưa từng sử dụng hoặc thấy sự xuất hiệnWhenContainedIn như một cách để tìm thứ gì đó trong hệ thống phân cấp khung nhìn. Ninja lừa! –

+1

Đây là một trong những thủ thuật tuyệt vời nhất mà tôi từng thấy! – kygcoleman

+0

hoạt động! "appearanceWhenContainedIn" có thể được lấy ra khỏi phương thức và được đặt trong viewDidLoad – turbo

15

Nếu bạn nhắm mục tiêu iOS6 và sau bạn không cần phải cung cấp cái nhìn tiêu đề của riêng bạn nếu bạn chỉ muốn tập trung tiêu đề tiêu đề.

Chỉ cần thực hiện

- tableView: willDisplayHeaderView: forSection:

và thiết lập thuộc tính textAligment của nhãn:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
{ 
    if([view isKindOfClass:[UITableViewHeaderFooterView class]]){ 

     UITableViewHeaderFooterView *tableViewHeaderFooterView = (UITableViewHeaderFooterView *) view; 
     tableViewHeaderFooterView.textLabel.textAlignment = NSTextAlignmentCenter; 
    } 
} 
+3

Đây phải là câu trả lời được chấp nhận. Sử dụng thủ thuật [UILabel appearanceWhenContainedIn: UITableViewHeaderFooterView.class ...] sẽ thay đổi * tất cả * tiêu đề của bạn trong * tất cả * bảng tổng quan trong ứng dụng của bạn – tiritea

9

câu trả lời Volker trong Swift:

Nếu bạn nhắm mục tiêu iOS6 trở lên bạn không phải cung cấp chế độ xem tiêu đề của riêng mình nếu bạn chỉ muốn o căn giữa tiêu đề tiêu đề.

Chỉ cần thực hiện

- tableView:willDisplayHeaderView:forSection: 

và thiết lập thuộc tính textAligment của nhãn:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    if let headerView = view as? UITableViewHeaderFooterView { 
     headerView.textLabel?.textAlignment = .Center 
    } 
} 
2

Để thực hiện phương pháp này được gọi là đầu tiên bạn nên thực hiện

titleForHeaderInSection 

sau đó tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) phương pháp sẽ được gọi là

Swift Giải pháp:

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    if let headerView = view as? UITableViewHeaderFooterView { 


     headerView.textLabel?.textAlignment = Localize().isRTL ? .Right : .Left 
     headerView.textLabel?.text = partsDataSource[section] 
     headerView.textLabel?.textColor = UIColor (red: 0.0902, green: 0.2745, blue: 0.2745, alpha: 1.0) 
     headerView.textLabel?.font = UIFont(name: UIDecorator.sharedInstance.PRIMARY_FONT, size: 14.0) 
     headerView.contentView.backgroundColor = UIDecorator.sharedInstance.currentTheme.lightShadeColor 
    } 
} 

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return " " 
} 
0

Trong Xamarin:

 // Center Header 
     public override void WillDisplayHeaderView(UITableView tableView, UIView headerView, nint section) 
     { 
      if (headerView.GetType() == typeof(UITableViewHeaderFooterView)) 
      { 
       UITableViewHeaderFooterView tableViewHeaderFooterView = (UITableViewHeaderFooterView)headerView; 
       tableViewHeaderFooterView.TextLabel.TextAlignment = UITextAlignment.Center; 
      } 
     } 
Các vấn đề liên quan