2016-07-09 7 views
0

Ich versuche, eine UIButton zu einer UITableHeaderFooterView hinzuzufügen.UITableViewController Tabellenkopfzeile Hinzufügen einer UIButton mit Autolayout-Einschränkungen

Es scheint, dass ich nur bestimmte CGRect-Frame verwenden kann, um seine Position und Größe im Code (< - viel Suche auf StackOverFlow) zu fixieren. Und die Position ist sehr schwer zu kontrollieren, immer herumfliegen.

UIButton *scanQRCodeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
scanQRCodeButton.frame = CGRectMake(0.0f, 5.0f, 320.0f, 44.0f); 
scanQRCodeButton.backgroundColor = [UIColor redColor]; 
[scanQRCodeButton setTitle:@"Hello" forState:UIControlStateNormal];  
[cell addSubview:scanQRCodeButton]; 

Aber was ich wirklich will, ist "Constraints" wie CenterX, CenterY und Proportionalbreite zu verwenden, um es an unterschiedliche Bildschirmgröße anzupassen. Dann kommt das Problem mit dem Teil "constraintWithItems":

die headerView von UITableView Get:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    static NSString *headerReuseIdentifier = @"TableViewSectionHeaderViewIdentifier"; 

    // Reuse the instance that was created in viewDidLoad, or make a new one if not enough. 
    UITableViewHeaderFooterView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerReuseIdentifier]; 
    if (headerView == nil) { 
     [tableView registerClass:[UITableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"TableViewSectionHeaderViewIdentifier"]; 
     headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"TableViewSectionHeaderViewIdentifier"]; 
    } 

    headerView.textLabel.text = @"MISSION"; 
    headerView.contentView.backgroundColor = [UIColor blackColor]; 

Erstellen Sie die UIButton auf dem headerView im gleichen Block wie oben:

UIButton *goBack = [[UIButton alloc] init]; 
    [goBack setImage:[UIImage imageNamed:@"Back"] forState:UIControlStateNormal]; 
    [goBack addTarget:self 
      action:@selector(back:) 
forControlEvents:UIControlEventTouchUpInside]; 

    [headerView addSubview:goBack]; 

Setzen Sie dann die Einschränkungen und geben Sie den Header zurück:

Problem: Wenn ich in "constraintWithItem" "headerView.goBack" sage, warnt der Compiler mich, dass "Property goBack nicht für Objekt vom Typ UITableHeaderFooterView gefunden wurde".

Update 1

Von Natarajan Antwort, versuche ich dies jetzt zu tun:

headerView.translatesAutoresizingMaskIntoConstraints = false; 
    goBack.translatesAutoresizingMaskIntoConstraints = false; 
    NSDictionary *metrics = @{ @"width"   : @(CGRectGetWidth(self.view.frame)/10) }; 
    [headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack]|" options:0 metrics:metrics views:@{@"goBack":goBack}]]; 
    [headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack]|" options:0 metrics:metrics views:@{@"goBack":goBack}]]; 

Aktuelles Problem: Die "Metriken" Teil nicht funktioniert. Ich möchte eine proportionale Breite zu HeaderView oder TableView anstelle von festen Zahlen haben. Sollte ich "self.view.frame" verwenden (auch self.tableView.frame versucht)?

Update 2

Es kann auch mit dem headerView jetzt ein Problem. Wenn ich "headerView.translationsAutoresizingMaskIntoConstraints = false;" verwende, muss ich auch die Position von headerView manuell setzen. Mit dem folgenden Code kann HeaderView jedoch immer noch nicht ordnungsgemäß festgelegt werden. Ich habe versucht, es zuerst zu TableView hinzuzufügen und es wie UIButton festzulegen, aber es konnte nicht auf die gleiche Weise funktionieren.

[headerView addSubview:goBack]; 
[tableView addSubview:headerView]; 

headerView.translatesAutoresizingMaskIntoConstraints = false; 
goBack.translatesAutoresizingMaskIntoConstraints = false; 

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack(40.0)]|" options:0 metrics:nil views:@{@"goBack":goBack}]]; 
[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack(40.0)]|" options:0 metrics:nil views:@{@"goBack":goBack}]]; 
[tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[headerView]|" options:0 metrics:nil views:@{@"headerView":headerView}]]; 
[tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[headerView]|" options:0 metrics:nil views:@{@"headerView":headerView}]]; 

Antwort

0

Ich denke, "goBack" kann nicht als HeaderView-Eigenschaft zugegriffen werden. Versuche es zu finden.

for (UIView *view in headerView.contentView.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      //found button 
     } 
    } 
0

Complier Warnung ist die richtige UITableViewHeaderFooterView die Eigenschaft nicht mit dem Namen „goBack“, die Sie als Subview UITableViewHeaderFooterView gerade hinzugefügt haben. Versuchen Sie also, den "goBack" -Button in Ihrem Constraint-Code wie unten angegeben zu übergeben.

Um goBack Taste voll belegt auf HeaderView gesetzt:

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack(40.0)]" options:0 metrics:nil views:@{@"goBack":goBack}]]; 

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack(30.0)]" options:0 metrics:nil views:@{@"goBack":goBack}]]; 

Hinweis:

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack]|" options:0 metrics:nil views:@{@"goBack":goBack}]]; 

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack]|" options:0 metrics:nil views:@{@"goBack":goBack}]]; 

Um goBack Taste für bestimmte Breite und Höhe eingestellt Vor Einschränkung Hinzufügen nicht die headerView.translatesAutoresizingMaskIntoConstraints = false; setzen vergessen und goBack.translatesAutoresizingMaskIntoConstraints = false;

+0

Thx! Bitte beachten Sie mein aktuelles Update 1: Ich versuche stattdessen eine proportionale Breite zu haben. –

+0

Es gibt jetzt auch ein Problem mit der HeaderView. Wenn ich "headerView.translationsAutoresizingMaskIntoConstraints = false;" verwende, muss ich auch die Position von headerView manuell setzen. Mit dem folgenden Code kann HeaderView jedoch immer noch nicht ordnungsgemäß festgelegt werden. Ich habe versucht, es zuerst zu TableView hinzuzufügen und es wie UIButton festzulegen, aber es konnte nicht auf die gleiche Weise funktionieren. –

+0

Ich möchte proportional zu der HeaderView oder TableView statt feste Zahlen haben. Ich benutze "self.view.frame" (auch versucht self.tableView.frame) in "metrics", aber beide können nicht richtig funktionieren. –

Verwandte Themen