2009-05-22 9 views
6

Ich versuche, eine UISegmentedControl in einer Gruppe UITableViewCell sehr ähnlich wie in den WLAN-Einstellungen in der Einstellung Anwendung. Das Problem, das ich habe, ist, dass ich eine doppelte Grenze bekomme. Ich bekomme eine Grenze für die UISegmentedControl und eine für die UITableViewCell.UITableViewCell/UISegmentedControl Grenzproblem

Ich schätze, ich muss den Rand von der UITableViewCell entfernen. Wie kann ich das tun?

+2

Ein kleiner Stil Vorschlag: die richtige Aktivierung der Verwendung Klassennamen im Titel der Frage würden das Lesen wesentlich erleichtern. Sie können es nach der Tat ändern. Entschuldigung, ich habe keine Antwort, ich mache nur Desktop-Apps im Moment. –

Antwort

7

Ich habe gerade festgestellt, dass immer noch Antworten erhalten. Wie es passiert, musste ich dies für ein anderes Projekt tun und seit ich diese Frage gestellt habe, habe ich viel mehr über iPhone Dev gelernt. Hier ist, wie ich es kürzlich gelöst habe. Es geht darum, den Rahmen auf die richtige Größe zu bringen. Dies sollte es für eine Standardtabelle tun.

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: Die Zahlen, die du angegeben hast, sind richtig für den Hochformat-Modus, funktionieren aber nicht im Querformat. Wählen Sie dafür :) –

+0

Ah, wahr. Ich denke, Sie könnten tableView.frame.size.width - 18.0f für die Breite tun. Alle anderen Werte sollten gleich sein. –

1

Ich habe etwas weiter damit. Bis jetzt habe ich UITableViewCell subclassiert. Ich habe eine Nib mit einem UISegmentedControl darin erstellt und ich habe den UITableViewCell background alpha auf 0 gesetzt. Es sieht immer noch nicht ganz richtig aus, aber es ist besser als vorher.

0

Der Trick scheint zu sein, die UISegmentedControl auf die Größe der backgroundView der Steuerung, nicht die contentView Größe. Ich konnte es programmatisch tun, indem Sie folgendermaßen vorgehen:

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

Beachten Sie, dass, wenn Sie ein Zubehörteil verwenden, müssen Sie für die auch accessoryView berücksichtigen.

Der Grund dafür ist, dass die Ansicht Hierarchie ist wie folgt:

  • self (die UITableViewCell oder Unterklasse)
    • backgroundView
    • contentView
      • (Ihre Kontrollen gehen hier)
    • accessoryView

In Portrait Layout der backgroundView 's-Rahmen ist {{9, 0}, {302, 44}}, während die contentView' s Rahmen etwas kleiner, bei {{10, 1}, {300, 42}} ist. Dies gibt der Zelle ihren 1px "Rahmen", wenn der Tabellenstil gruppiert ist. Sie müssen die Größe contentViewund Ihre Kontrolle ändern, um die passende Größe zu erhalten.

. (Anmerkung: Während tatsächlich von Apple mehrere Beispiele für eine UISegmentedControl im UICatalog Beispielcode Projekt in the SDK hat, sie effektiv „betrügen“ durch einen UIViewController mit und Einstellung der Hintergrundfarbe des Hauptansicht der Tabelle Hintergrundfarbe)

+0

Der segmentierte Steuerelement-Beispielcode, auf den Sie verweisen, verwendet eine allgemeine Ansicht, keine Tabellenansicht, um die Steuerelemente anzuzeigen. Es sieht nur wie eine gruppierte Tabellenansicht aus, da diese Hintergrundfarbe verwendet wird. –

+0

Eingegraben und die richtige Antwort gefunden. Habe einen Hinweis auf meine alte Antwort behalten, damit andere wissen, dass Apples Beispiel das nicht wirklich macht. –

3

Im Falle der Wi-Fi-Einstellungen, vermute ich, was sie getan haben, ist die Schaltfläche "Dieses Netzwerk vergessen", die "IP-Adresse" Bezeichnung und die "DHCP/BootP/Static" segmentierten Steuerung alle Teil von die Kopfzeile der Tabelle. Wenn Sie dies in der Mitte Ihrer Tabelle tun müssen (im Gegensatz zu oben oder unten, für die Sie die tableHeaderView und tableFooterView Eigenschaften jeweils verwenden würden), würde ich vorschlagen, die Delegate-Methoden -tableView:viewForHeaderInSection: mit -tableView:heightForHeaderInSection, oder die entsprechende Footer Varianten. Mit jeder dieser Optionen würden Sie eine benutzerdefinierte Ansicht für diesen "Abschnitt" Ihrer Tabellenansicht einrichten (mit einer klaren Hintergrundfarbe oder [UIColor groupTableBackgroundColor]), die eine Beschriftung und ein segmentiertes Steuerelement enthält, die so angeordnet sind, dass sie mit den übrigen übereinstimmen die Tabellenabschnitte.

2

die Technik in this post Mit dem Hintergrundopazität des UITableViewCell entfernen arbeitete leichter für mich nur die UISegmentedControl zu bekommen in der Tabellenzeile zu zeigen.

+0

Dies ist der richtige Weg, um es zu tun - machen Sie den Rahmen der Kontrolle der gleiche wie die 'cell.contentView.bounds, setzen' autoresizingMask' zu 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight', fügen Sie das Steuerelement als Unteransicht von 'cell.contentView' hinzu und setzen Sie' cell.backgroundView' auf eine transparente 'UIView'. –

1

Meine Lösung besteht darin, dem segmentierten Steuerelement die Anpassung der Größe zu ermöglichen und den Hintergrund der Tabellenansicht in tableView:willDisplayCell:forRowAtIndexPath: auszublenden.

Dies ergibt Ergebnisse identisch mit dem „Settings.app> WiFi> Ihr Netzwerk> IP-Adresse“ Segmented-Kontrolle ohne jede Layout-Metriken Hartcodierung:

- (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; 
}