我想将几个按钮堆叠在一起,然后显示/隐藏它们作为切换方式。 (想象一下视频播放器中的播放/暂停/重放按钮)。iOS:使用NSLayoutConstraint将对象堆叠在彼此的顶部
是否可以使用NSLayoutConstraint来做到这一点?
另外,也许有更好的方法来在iOS中创建多状态按钮?
这里是我试过,但obvoiusly因为这使他们旁边的海誓山盟不起作用:
NSArray *constraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"|[_playButton][_pauseButton][_replayButton][_scrubber][_minimizeButton]|"
options:0
metrics:nil
views:viewsDictionary];
使用从下面@dasdom一些技巧,我已经想出了以下内容:
NSArray *constraints = [NSLayoutConstraint
constraintsWithVisualFormat:@"|[_pauseButton]-[_scrubber]-[_minimizeButton]|"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:viewsDictionary];
[constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"|[_playButton]"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:viewsDictionary]];
[constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"|[_replayButton]"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:viewsDictionary]];
[self addConstraints:constraints];
这是非常接近的 - 水平间距是正确的,对于第一条规则中的项目(pauseButton,scrubber,最小化),它们垂直对齐,但播放和重放按钮太高...如果后续的NSLayoutFormatAlignAllCenterY
被忽略。
EDIT2:这里是我结束了最后的代码,花了比我想象的还要多得多,但似乎运作良好:
NSDictionary *metrics = @{
@"buttonPadding": @(kBarPaddingX)
};
// Align along Y center and set order, so scrubber stretches in the middle.
NSString *controlsVisualFormat =
@"|-buttonPadding-[_playButton]-[_scrubber]-[_minimizeButton]-buttonPadding-|";
NSArray *constraints = [NSLayoutConstraint
constraintsWithVisualFormat:controlsVisualFormat
options:NSLayoutFormatAlignAllCenterY
metrics:metrics
views:viewsDictionary];
// Set alignment of pauseButton and replayButton
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"|-buttonPadding-[_pauseButton]"
options:NSLayoutFormatAlignAllCenterY
metrics:metrics
views:viewsDictionary]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint
constraintsWithVisualFormat:@"|-buttonPadding-[_replayButton]"
options:NSLayoutFormatAlignAllCenterY
metrics:metrics
views:viewsDictionary]];
// Not sure why using NSLayoutFormatAlignAllCenterY above doesn't center the buttons vertically,
// so we need another set of constraints to center them vertically.
constraints = [constraints arrayByAddingObject:
[NSLayoutConstraint constraintWithItem:_pauseButton
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:_pauseButton.superview
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0]];
constraints = [constraints arrayByAddingObject:
[NSLayoutConstraint constraintWithItem:_replayButton
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:_replayButton.superview
attribute:NSLayoutAttributeCenterY
multiplier:1.0f
constant:0]];
我知道你已经接受了一个答案,但你确定你的布局不含糊吗?在viewDidAppear中设置一个断点,然后在调试器中剪切并粘贴以下内容:po [[UIWindow keyWindow] _autolayoutTrace]。 – bilobatum
是的,任何想法如何解决它? – Geoff
你需要在'contraintsWithVisualFormat'前加入'H:'和'V:'吗? – ansible