iOS Autolayout和UIToolbar/UIBarButtonItems
我有一个iOS视图,启用了自动布局功能,并且UIToolbar
与工具栏中包含的UISearchBar
和UISegmentControl
。我想UISearchBar
具有一个灵活的宽度,所以我需要添加一个约束来强制这个,但从我可以告诉你不能在Interface Builder中的UIToolbar
中的项目添加约束。选项全部禁用。iOS Autolayout和UIToolbar/UIBarButtonItems
之前AutoLayout
我会做到这一点autoresizingmasks
。
UIToolbars/UINavigationBars
内部不允许有限制吗?
在使用自动布局时,还能如何实现?
自动拨号约束只适用于UIViews
及其子类。
虽然UIToolbar
允许一些UIView
基于项目(如UISearchBar
和UISegmentedControl
),他们可能有UIBarButtonItems
不从UIView
继承共存。
直到自动布局可以与UIBarButtonItems
一起使用时,照你所做的那样操作。
您的替代方案是使用基于UIViews
的部件来滚动您自己的工具栏。
任何想法,如果苹果正在努力解决这个问题?如果我必须在不同的地方使用AL和旧的方法,它会让我感到不一致... – Petar 2014-11-26 14:48:48
您至少可以在代码中做到这一点;无论如何,我是放弃Interface Builder并在代码中使用它的类型。当涉及到添加或调整约束时,IB似乎常常陷入困境。这是我在自定义UIToolbar
子类的-initWithFrame:
方法中所做的。
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self addSubview:self.label];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1 constant:0]];
}
return self;
}
而且因为我喜欢懒惰的负载尽可能,这是我self.label
实例变量(当[self addSubview:self.label]
被上述传递消息的称呼)。
- (UILabel *)label {
if (_label) return _label;
_label = [UILabel new];
_label.translatesAutoresizingMaskIntoConstraints = NO;
_label.textAlignment = NSTextAlignmentCenter;
return _label;
}
似乎为我工作。尽管如此,我并没有添加任何UIBarButtonItems
,所以你的里程数不尽相同。
如果您尝试使用约束来重新定位现有的工具栏,您会发现NSLayoutAttributeCenterX约束非常有用。 – russes 2013-08-09 14:08:08
这也可以从故事板完成。
只需在工具栏中拖放项目,并将其中的一些变为灵活或固定的空间即可获得所需的效果。看下面的两个例子。
注:这是我回答的副本Aligning UIToolBar items,我stumbbled在这两个问题而寻找这样一个解决方案
我之前做了一些这样的东西,尽管我基本上只是等待视图的大小改变,然后相应地更新目标视图的框架。如果事实证明没有一种方法可以自动完成,那总是一个选项。 – Brian 2013-02-20 15:25:59
你可以发布图片吗? – 2013-03-20 07:31:00
我会的,但我最终放弃了AutoLayout并回到使用autoresizingmasks。它使用该模型非常有效。 – outerstorm 2013-03-21 12:13:49