2015-06-15 7 views
5

Ich habe eine UIViewController mit einer UIToolBar unter der UINavigationBar und eine UITableView darunter. Die einzigen UIBarButtonItem auf meinem UIToolBar ist ein UISegmentedControl wie in der Abbildung unten: enter image description hereUIToolbar mit UISegmentedControl AutoLayout (/ volle Breite)

aber wie bekomme ich die UISegmentedControl/UIBarButtonItem die UIToolBar wie im App Store App zu füllen zu strecken?

Beachten Sie, dass ich auch Landscape-Modus unterstütze, so muss es automatisch gedehnt werden, um die neue Breite anzupassen, wenn das Gerät gedreht wird. Dies ist etwas, was ich mit AutoLayout erreichen wollte, aber soweit ich weiß, kann ich AutoLayout innerhalb einer UIToolBar nicht verwenden.

Irgendwelche Vorschläge (außer das UIToolbar durch ein UIView zu ersetzen)?

+0

nur uiview anstelle von UIToolbar – sim

+0

@sim das ist, was ich versuche zu vermeiden, aber ich könnte darauf zurückgreifen müssen, wenn es keine Möglichkeit gibt, diese Arbeit – Aleksander

+0

In diesem Fall zu machen Sie müssen die Breite des Uissegmentcontrollers im Code einstellen und Änderungen an der Geräteausrichtung vornehmen, um seine Breite zu aktualisieren. Ich denke, es ist schwieriger, dann verwenden Sie einfach uiview mit dem Auto-Layout – sim

Antwort

7

Ich erstellte eine Symbolleiste mit einem segmentierten Steuerelement innerhalb, dann machte die segmentierte Steuerelement 320 breit. Ich setze dann flexible Layout-Guides auf jeder Seite, um die segmentierte Steuerung in die Mitte zu zwingen. Im Hochformat sieht das gut aus, aber das segmentierte Steuerelement wird sich nicht für die Landschaft ausstrecken.

Portrait (einschließlich IB-Setup und Simulator) enter image description here

Landschaft (enthält auch IB und Setup Simulator) enter image description here

Es scheint, wie die App Store eine segmentierte Kontrolle hat, die auf eine bestimmte Breite festgelegt ist und dann darf die Ansicht nicht rotieren. Ich verstehe, dass Sie möchten, dass das segmentierte Steuerelement die Breite mit dem Layout ändert, aber leider ist das mit dem automatischen Layout im Moment nicht möglich.

Mein Vorschlag wäre, wenn Sie wirklich wollten, dass das segmentierte Steuerelement die Breite mit Rotation änderte, würde programmatisch die Breite einstellen, wenn das Gerät in Querformat rotiert.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation)) 
    {    
     //set segmented control to landscape 
    } 

    if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)) 
    { 
     //set segmented control to portrait width 
    } 
} 

Eine weitere Sache, wenn Sie dieses Gerät Rotation Sachen am Ende tun verwenden, werden Sie müssen noch diese flexible Spacer in IB Ihre segmentierten Steuerung in der Symbolleiste zentriert halten

+1

willroateointerfaceorientation ist veraltet – sim

+0

Dies ist eigentlich eine großartige Lösung. Ich weiß nicht einmal, ob es notwendig ist, die Breite des 'UISegmentierten Controls' zu aktualisieren, weil das ziemlich gut aussieht. – Aleksander

5

Sie tun können, dass mit Code. Etwas wie folgt aus:

@interface ViewController() 
@property (strong, nonatomic) IBOutlet UIToolbar *toolbar; 
@property (strong, nonatomic) IBOutlet UISegmentedControl *segment; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _segment.translatesAutoresizingMaskIntoConstraints = NO; 
    [_toolbar addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[_segment]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_segment)]]; 
    [_toolbar addConstraint:[NSLayoutConstraint constraintWithItem:_segment 
                 attribute:NSLayoutAttributeCenterY 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:_toolbar 
                 attribute:NSLayoutAttributeCenterY 
                 multiplier:1. 
                  constant:0.]]; 
} 

@end  
+0

Ich werde Ihre Lösung versuchen, wenn ich zurück zu meinem Computer komme, und die akzeptierte Antwort aktualisieren, wenn dies funktioniert.Nur ein kleiner Tipp: IBOutlets sollten "schwach" sein, nicht "stark" :) – Aleksander

+0

Ich habe das nur aus meinem Beispielprojekt kopiert/eingefügt, das sollte kein Problem sein, denke ich =) –

+0

Funktioniert perfekt !! auf iOS 9 .. danke Aber ich setze IBOutlets zu schwach – Pierre