2008-11-17 5 views
14

Ich habe eine Schaltfläche, die ich als Unteransicht der Tabellenansicht tableHeaderView hinzufüge. Die Schaltfläche scheint gut zu sein, und das Antippen und Festhalten funktioniert mit Unterbrechungen - in den meisten Fällen reagiert sie jedoch nicht. Ich habe versucht, es als Unteransicht der Tabelle selbst hinzuzufügen; Der Effekt ist ungefähr derselbe. Ich dachte, dass das Problem mit der Touch-Überwachung der Bildlaufansicht sein könnte, aber das Deaktivieren des Scrollens auf der Tabelle hat auch keine Wirkung.UIButton in einer UITableView-Kopfzeile ignoriert die meisten Berührungen

Mache ich etwas falsch? Hat jemand anderes das angetroffen?

bearbeiten - um zu verdeutlichen, ich spreche über die Haupt-Tabellenüberschrift, nicht eine Abschnittsüberschrift, in einer gruppierten Stil-Tabelle; denke grundsätzlich nach dem "Kontakt" -Bildschirm.

+0

Ich hatte dieses genaue Problem, aber die akzeptierte Antwort funktionierte nicht für mich. Die [Antwort auf diese Frage] (http://stackoverflow.com/questions/19256996/uibutton-not-showing-highlight-on-tap-in-ios7/19299451#19299451) behob das Problem für mich perfekt. –

Antwort

22

Ich hatte das gleiche Problem. In meinem Fall hatte ich eine Containeransicht, die in IB instanziiert wurde (die als Tabellenansichtskopfzeile im Code verwendet wurde), wobei eine UIImageView den gesamten Rahmen dieses Containers einnahm. Der Fehlerbehebungs-Button befand sich in der Bildansicht.

Es stellte sich heraus, dass ich Sizing Streben in IB gesetzt zu haben, benötigt wie folgt ...

Container Ansicht: Außenanker alle auf, Innen Redimensionierung - alle

Sub Bildansicht aus: alle Streben an (Innen und außen)

Ich hatte mehrere verschiedene Tabellenansichten, alle mit Header-Ansichten. Einige würden auf Berührungsereignisse richtig reagieren, einige waren flockig. Dies löste mein Problem

+2

+1. Das hat für mich funktioniert. Ich benutze IB dafür nicht, also musste ich die Struts mit '-setAutoresizingMask:' programmatisch setzen, und ich fand es nur auf dem Behälter notwendig. Die innere Bildkontrolle brauchte nichts. Vielen Dank! Wäre nie zufällig zufällig darauf gestoßen. –

+0

Nach stundenlangem Kopfschütteln funktionierte das für mich. Vielen Dank. – thedeveloper3124

+1

In der Tat. In meinem Fall hatte ich einige UITextFields in der Kopfzeile, die die Tastatur bringen würde. Ich änderte die Größe meiner Tabellenansicht, um die Tastatur anzupassen. Alles sah optisch korrekt aus und der Tisch scrollte genau wie gewünscht. Allerdings reagierte keines der Steuerelemente im Tabellenheader, und ich änderte die Größe der Tabellenansicht. In meiner Containeransicht wurde die Innenskalierung aktiviert. Sobald ich es ausgeschaltet hatte, funktionierte alles! Vielen Dank. –

-7

Sie sollten bedenken, dass dies nicht die Absicht von headerView ist und dass eine Implementierung wie diese zu einer Ablehnung im AppStore aufgrund einer HIG-Verletzung führen könnte. Angesichts der Tatsache, dass die Dimensionen eines Headers klein sein sollen, ist es wahrscheinlich besser, eine Umstrukturierung Ihrer Ansicht in Erwägung zu ziehen. Abgesehen davon, dass es keine einfache Möglichkeit gibt, Touch-Ereignisse zu erkennen, die Geometrie selbst zu bestimmen und dann einen Selektor basierend auf der Geometrie auszuführen - kurz gesagt, eine eigene Button-Klasse zu rollen.

+0

Ich kann nichts in der HIG finden, das die Verwendung von Knöpfen in Tabellen- (im Gegensatz zu Abschnitts-) Kopf-/Fußzeilenansichten verbietet; Die App "Kontakte" fügt Schaltflächen ohne Probleme an die Fußzeile der Tabelle an, und das Beispiel "HeaderFooter" von Apple macht etwas ähnliches (obwohl es das gleiche Problem aufweist). Radar, vielleicht? –

+0

Wahrscheinlicher als nicht, würde ich vorschlagen, einen Fehler zu archivieren. – wisequark

7

ich vollständig mit Wisequark nicht einverstanden ist - es gibt absolut nichts falsch mit einer Taste in der tableHeaderView setzen, und darunter würde man nicht riskieren Ihre App aus dem Store App abgelehnt. TableHeaderView ist eine beliebige Ansicht, die alle von Ihnen ausgewählten Elemente enthält.

Soweit Ihr Problem, könnte es sein, dass Sie eine Ansicht haben, die Ihre Schaltfläche verdeckt, oder es könnte einfach ein Fehler sein, der an Apple gemeldet werden sollte.

10

Ich hatte ein ähnliches Problem - ein Textfeld und eine Schaltfläche in einer Ansicht als die Tabellenkopfansicht eingestellt, die nicht auf Berührungsereignisse reagieren würde. setAutoResizing hat programmatisch für mich gearbeitet.

Mein Controller erweitert UITableViewController und viewDidLoad sieht wie folgt aus:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    MYCustomWidget *headerView = [[[NSBundle mainBundle] 
       loadNibNamed:@"MYCustomWidgetView" owner:self options:nil] 
       objectAtIndex:0]; 

    [headerView setAutoresizingMask:UIViewAutoresizingNone]; 

    self.tableView.tableHeaderView = headerView; 
} 

('MYCustomWidget' erstreckt sich UIView und 'MYCustomWidgetView' ist eine XIB-Datei).

+3

Einstellung der AutoresizeMask hat es für mich getan. – Matjan

2

Meine Situation war ähnlich wie bei Danny Hall (die Tabellenkopfansicht war eine UIImageView, und es gab eine UIButton, die eine Unteransicht der UIImageView war). In meinem Fall scheint das Problem dadurch verursacht worden zu sein, dass die Schaltfläche eine Unteransicht der Bildansicht ist. Was für mich funktionierte, war eine UIView "containing" Ansicht zu erstellen, so dass sowohl die Bildansicht als auch die Schaltfläche Teilansichten der "containing" Ansicht waren. seltsam.

+0

Ja, UIImageView hat 'userInteractionEnabled' standardmäßig auf' NO' gesetzt, so dass eine Schaltfläche als Unteransicht einer Bildansicht nicht auf Berührungen reagiert. Ich bin mir ziemlich sicher, dass das ein anderes Thema war. Danke für den Vorschlag. :) –

1

tableHeaderView hat 0 Höhe während es draw in UITableView Verarbeitung wird

Verwendung dieses UIView Subklasse die starke konstante Höhe einzustellen und ignorieren UITableView Verarbeitung

#import <UIKit/UIKit.h>             
@interface CustomHeaderCell : UIView 

@end 

//----- 

@import "CustomHeaderCell.h" 

@implementation CustomHeaderCell 


-(void)setFrame:(CGRect)frame { 
    frame.size.height = 43; // !!! constant height 
    [super setFrame:frame]; 
} 

@end 
2

Seltsamerweise, aber die Tabellenkopfansicht ist scheinbar falsch in der Größe geändert. Ich benutze Auto-Layout, so Autoresizing-Maske war keine Option für mich. Nach meiner Ansicht Hierarchie Inspektion: enter image description here

und bemerkte, dass meine benutzerdefinierten Header Ansicht falsche Höhe hatte, so dass nur weniger als die Hälfte davon abgreifbar war (siehe hervorgehoben Ansicht):

enter image description here

manuelle Aktualisierung seine Höhe das Problem behoben:

- (void)viewDidLayoutSubviews { 
    CGRect frame = self.tableView.tableHeaderView.frame; 
    frame.size.height = 116.0; 
    self.tableView.tableHeaderView.frame = frame; 
} 

enter image description here

Außerdem kann die Kopfhöhe der Tabellenansicht nach der Änderung der Ausrichtung ungültig werden. Dieses Problem kann auch mit der bereitgestellten Lösung behoben werden.

-1

Vergessen Sie nicht, in die Fußzeile Höhe einzustellen:

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ 
0

ich das gleiche Problem haben UIButtons Aktionen nicht in UITableView's Kopfsicht arbeiten. Zuerst versuchte ich setAutoresizingMask zu .None, die nicht funktioniert, dann nach die Antworten von @Davyd und @Alexey Lesen merke ich, dass ich nicht die Höhe der Header gesetzt beurteilten Dann habe ich es mag: -

self.tablevwMain.tableHeaderView?.frame = CGRect(x: 0, y: 0, width: width_view, height: your_height) 

Und alle UIButton's innen UITableView's Header-Ansicht funktioniert ordnungsgemäß.

Verwandte Themen