2015-06-15 3 views
5

У меня есть UIViewController с UIToolBar ниже UINavigationBar и UITableView ниже этого. Только UIBarButtonItem на моем UIToolBar является UISegmentedControl, как на скриншоте ниже: enter image description hereUIToolbar с UISegmentedControl AutoLayout (/ полная ширина)

Однако, как я получаю UISegmentedControl/UIBarButtonItem растягивать, чтобы заполнить UIToolBar как в приложении App Store?

Имейте в виду, что я также поддерживаю ландшафтный режим, поэтому он должен автоматически растягиваться, чтобы соответствовать новой ширине, когда устройство повернуто. Этого я надеялся достичь с AutoLayout, но насколько я знаю, я не могу использовать AutoLayout внутри UIToolBar.

Любые предложения (за исключением замены UIToolbar на UIView)?

+0

просто использовать UIView вместо UIToolbar – sim

+0

@sim это то, что я пытаюсь избежать, но я, возможно, придется отступить на том, что, если нет никакого способа, чтобы сделать эту работу – Aleksander

+0

В этом случае вам нужно настроить ширину uisegmentcontroller в коде и обработать изменения ориентации устройства, чтобы обновить его ширину, я думаю, что это сложнее, чем просто использовать uiview с автозапуском – sim

ответ

7

Я создал панель инструментов с сегментированным управлением внутри, а затем сделал сегментированный элемент управления 320 широким. Затем я устанавливаю гибкие направляющие макетов с каждой стороны, чтобы заставить сегментированный элемент управления в центр. Это выглядит прекрасно в портрете, но сегментированный контроль не будет растягиваться для пейзажа.

Портрет (включает в себя установку IB и имитатор) enter image description here

ландшафт (также включает в себя установку IB и имитатор) enter image description here

Похоже, приложение магазин имеет сегментированный элемент управления, который установлен в определенные ширины и тогда вид не может вращаться. Я понимаю, что вы хотите, чтобы сегментированный элемент управления менял ширину с макетом, но, к сожалению, это невозможно с автоматическим расположением на данный момент.

Мое предложение было бы, если бы вы действительно хотели, чтобы сегментированный элемент управления изменял ширину с вращением, было бы программно устанавливать ширину, когда устройство поворачивается в альбомное. более

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

Одно дело, если вы в конечном итоге с помощью этого поворота устройство материал, вы все равно нужны эти гибкие распорки в IB, чтобы сохранить ваш сегментированный управления сосредоточены на панели инструментов

+1

willrotatetointerfaceorientation устарела – sim

+0

Это действительно отличное решение. Я даже не знаю, нужно ли обновлять ширину 'UISegmentedControl', потому что это выглядит неплохо. – Aleksander

5

Вы можете сделать это с код. Что-то вроде этого:

@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

Я попробую ваше решение, когда вернусь на свой компьютер, и обновить принятый ответ, если это будет работать.Просто немного подсказки: IBOutlets должен быть «слабым», а не «сильным» :) – Aleksander

+0

Я только что скопировал/вставил это из моего образца проекта, это не должно быть проблемой, я думаю =) –

+0

Работает отлично !! на iOS 9 .. спасибо. Но я установил IBOutlets на слабый – Pierre