3 Stimmen

Wie setze ich die Breite eines UISegmentControls in einer UINavigationBar dynamisch auf maximale Breite?

Dies ist der Code, den ich derzeit verwende. Leider ist der UISegmentedControl nicht auf volle Breite für die Leiste. Gibt es einen schnellen und einfachen Weg, um ihn in Code auf maximale Breite zu setzen, ohne eine genaue Rahmenbreite angeben zu müssen?

    UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                                    target:self
                                                                                    action:@selector(addItem:)] autorelease];
    self.navigationItem.rightBarButtonItem = addButton;

    UISegmentedControl *segBar = [[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Erster", @"Zweiter", @"Dritter", nil]] autorelease];
    [segBar setSegmentedControlStyle:UISegmentedControlStyleBar];
    [segBar sizeToFit];
    self.navigationItem.titleView = segBar;

So sieht es derzeit aus:

Bildbeschreibung hier eingeben

So soll es aussehen:

Bildbeschreibung hier eingeben

2voto

Mike Punkte 9605

Während dies leicht hackisch ist und das gesamte gewünschte Verhalten nicht kennt (wie zum Beispiel, was passiert, wenn es sich dreht?), habe ich nicht sofort eine Möglichkeit gesehen, die Breiten schön zu setzen. Probieren Sie dies aus und/oder passen Sie es an Ihre Bedürfnisse an:

// Dies nimmt die Breite der Ansicht, erhält 80% dieser Breite (um Platz links vom Navigationsbutton zu ermöglichen) und
// teilt sie durch 3 für jedes einzelne Segment
CGFloat approxWidth = (CGRectGetWidth(self.view.frame) * .80) / 3;
[[UISegmentedControl appearance] setWidth:approxWidth forSegmentAtIndex:0];
[[UISegmentedControl appearance] setWidth:approxWidth forSegmentAtIndex:1];
[[UISegmentedControl appearance] setWidth:approxWidth forSegmentAtIndex:2];

// Erstellen Sie die Segmentsteuerung und setzen Sie sie als den Titel der Ansicht
UISegmentedControl *segBar = [[UISegmentedControl alloc] initWithItems:@[@"Erster", @"Zweiter", @"Dritter"]];
self.navigationItem.titleView = segBar;

Das ergibt folgendes Ergebnis für iPhone und iPad:

Bildbeschreibung eingeben Bildbeschreibung eingeben

BEARBEITEN: Es ist auch erwähnenswert, dass Ihr Code einige Dinge nicht verwendet. Zum Beispiel wird ARC nicht verwendet, was ich sehr empfehlen würde. Sie haben setSegmentedControlStyle verwendet, das in iOS7 veraltet ist, und es gibt einen einfacheren / saubereren Weg, um ein NSArray zu erstellen:

NSArray *array = @[object1, object2];

// Das obige ist viel sauberer als
NSArray *array = [NSArray arrayWithObjects:object1, object2, nil];

1voto

duan Punkte 7733

Verwenden Sie die API von UISegmentControl, um eine explizite Breite für jeden Segment festzulegen

func setWidth(_ width: CGFloat, forSegmentAtIndex segment: Int)

0voto

Ilias Karim Punkte 3785

Ich würde UISegmentedControl untergeordnet hat, wenn Sie noch nicht und dann überschreiben sizeThatFits wie folgt:

override func sizeThatFits(size: CGSize) -> CGSize {
    return CGSize(width: size.width, height: super.sizeThatFits(size).height)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X