【问题标题】:UIToolbar with UISegmentedControl AutoLayout (/full width)带有 UISegmentedControl 自动布局的 UIToolbar(/全宽)
【发布时间】:2015-08-31 07:27:28
【问题描述】:

我有一个UIViewController,在UINavigationBar 下方有一个UIToolBar,在其下方有一个UITableView。我的UIToolBar 上唯一的UIBarButtonItemUISegmentedControl,如下图所示:

但是,我如何让 UISegmentedControl/UIBarButtonItem 像在 App Store 应用程序中一样伸展以填充 UIToolBar

请记住,我还支持横向模式,因此当设备旋转时,它必须自动拉伸以适应新的宽度。这是我希望通过AutoLayout 实现的目标,但据我所知,我不能在UIToolBar 中使用AutoLayout

有什么建议吗(除了将UIToolbar 替换为UIView)?

【问题讨论】:

  • 只用 uiview 代替 uitoolbar
  • @sim 这就是我想要避免的,但如果没有办法让这个工作,我可能不得不依靠它
  • 在这种情况下,您需要在代码中设置 uisegmentcontroller 的宽度并处理设备方向更改以更新其宽度,我认为使用 uiview 和 autolayout 会更难
  • 是的,你可能是对的。使用UIView 的唯一缺点是需要进行大量自定义才能使其表现得像UIToolbar。但我想这比手动处理尺寸更容易。

标签: ios objective-c autolayout uisegmentedcontrol uitoolbar


【解决方案1】:

你可以用代码做到这一点。像这样的东西:

@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    

【讨论】:

  • 当我回到我的电脑时,我会尝试你的解决方案,如果这行得通,我会更新接受的答案。小提示:IBOutlets 应该是weak,而不是strong :)
  • 我刚刚从我的示例项目中复制/粘贴了这个,我猜这应该不是问题 =)
  • 完美运行!!在 iOS 9 上.. 谢谢但我将 IBOutlets 设置为弱
  • 实际上,Apple 建议使用自 ios9 以来的强大插座。见developer.apple.com/videos/play/wwdc2015/407
【解决方案2】:

我创建了一个内部带有分段控件的工具栏,然后将分段控件设为 320 宽。然后,我在每一侧设置灵活的布局指南,以强制分段控件进入中心。这在纵向上看起来不错,但分段控件不会在横向上伸展。

纵向(包括 IB 设置和模拟器)

横向(还包括 IB 设置和模拟器)

似乎应用商店有一个分段控件,该控件设置为特定宽度,然后不允许旋转视图。我了解您希望分段控件随布局更改宽度,但不幸的是,目前自动布局无法做到这一点。

我的建议是,如果您真的希望分段控件通过旋转来改变宽度,则可以在设备旋转为横向时以编程方式设置宽度。

- (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 中的那些灵活的垫片来保持你的分段控制在工具栏中居中

【讨论】:

  • willrotatetointerfaceorientation 已弃用
  • 这实际上是一个很好的解决方案。我什至不知道是否有必要更新 UISegmentedControl 的宽度,因为这看起来非常好。
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2014-06-11
  • 2020-07-20
  • 2012-12-25
  • 1970-01-01
相关资源
最近更新 更多