水平 UIScrollView 自动布局约束本地化
Horizontal UIScrollView autolayout constraint localization
我有多个按钮,由一些 10 像素的填充 (leadingPadding) 分隔,如果是英语,项目必须从左到右开始,如果是阿拉伯语,则从右到左和 centralized.
这是用来绘制滚动视图的代码:
var previousView: UIView = self.itemsScrollView!
for i in 0..<self.items.count {
let sectionButton = UIButton(frame: CGRectZero)
sectionButton.titleLabel.text = "i = " + i
sectionButton.translatesAutoresizingMaskIntoConstraints = false
self.itemsScrollView!.addSubview(sectionButton)
// Left Constraint
let leftConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Leading,
relatedBy: .Equal,
toItem: toView,
attribute: (toView === self.itemsScrollView!) ? .Leading : .Trailing,
multiplier: 1.0,
constant: leadingPadding);
self.itemsScrollView! .addConstraint(leftConstraint)
// Top Constraint
let topConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Top,
relatedBy: .Equal,
toItem: self.itemsScrollView!,
attribute: .Top,
multiplier: 1.0,
constant: self.itemPaddingTopBottom);
self.itemsScrollView! .addConstraint(topConstraint)
// Width Constraint
let widthConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: buttonWidth);
self.itemsScrollView! .addConstraint(widthConstraint)
// Height Constraint
let heightConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: itemHeight);
self.itemsScrollView! .addConstraint(heightConstraint)
previousView = sectionButton
}
// add Trailing constraint on scroll
if (previousView !== self.itemsScrollView!) {
let leftConstraint = NSLayoutConstraint(
item: previousView,
attribute: .Trailing,
relatedBy: .Equal,
toItem: self.itemsScrollView!,
attribute: .Trailing,
multiplier: 1.0,
constant: 0.0);
self.itemsScrollView! .addConstraint(leftConstraint)
}
当语言方向为 LTR 时效果很好。
当语言方向为 RTL 时出现奇怪的行为(它们需要像上图一样集中)
我假设这与 scrollView 的 Trailing 约束有关,但我不确定。如果是,有什么办法可以解决吗?
谢谢
您不应该直接在滚动视图中添加多个视图。相反,你应该添加一个容器视图,在滚动视图中水平居中,它应该包括所有必要的子视图。容器视图的宽度必须由其子视图确定,因此在 LTR 模式下,第一个项目前导与容器前导对齐,最后一个项目尾随与容器尾部对齐,或者第一个项目尾部与容器尾部对齐,最后一个项目前导是与以 RTL 模式领先的容器对齐
我有多个按钮,由一些 10 像素的填充 (leadingPadding) 分隔,如果是英语,项目必须从左到右开始,如果是阿拉伯语,则从右到左和 centralized.
这是用来绘制滚动视图的代码:
var previousView: UIView = self.itemsScrollView!
for i in 0..<self.items.count {
let sectionButton = UIButton(frame: CGRectZero)
sectionButton.titleLabel.text = "i = " + i
sectionButton.translatesAutoresizingMaskIntoConstraints = false
self.itemsScrollView!.addSubview(sectionButton)
// Left Constraint
let leftConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Leading,
relatedBy: .Equal,
toItem: toView,
attribute: (toView === self.itemsScrollView!) ? .Leading : .Trailing,
multiplier: 1.0,
constant: leadingPadding);
self.itemsScrollView! .addConstraint(leftConstraint)
// Top Constraint
let topConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Top,
relatedBy: .Equal,
toItem: self.itemsScrollView!,
attribute: .Top,
multiplier: 1.0,
constant: self.itemPaddingTopBottom);
self.itemsScrollView! .addConstraint(topConstraint)
// Width Constraint
let widthConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: buttonWidth);
self.itemsScrollView! .addConstraint(widthConstraint)
// Height Constraint
let heightConstraint = NSLayoutConstraint(
item: sectionButton,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1.0,
constant: itemHeight);
self.itemsScrollView! .addConstraint(heightConstraint)
previousView = sectionButton
}
// add Trailing constraint on scroll
if (previousView !== self.itemsScrollView!) {
let leftConstraint = NSLayoutConstraint(
item: previousView,
attribute: .Trailing,
relatedBy: .Equal,
toItem: self.itemsScrollView!,
attribute: .Trailing,
multiplier: 1.0,
constant: 0.0);
self.itemsScrollView! .addConstraint(leftConstraint)
}
当语言方向为 LTR 时效果很好。
当语言方向为 RTL 时出现奇怪的行为(它们需要像上图一样集中)
我假设这与 scrollView 的 Trailing 约束有关,但我不确定。如果是,有什么办法可以解决吗?
谢谢
您不应该直接在滚动视图中添加多个视图。相反,你应该添加一个容器视图,在滚动视图中水平居中,它应该包括所有必要的子视图。容器视图的宽度必须由其子视图确定,因此在 LTR 模式下,第一个项目前导与容器前导对齐,最后一个项目尾随与容器尾部对齐,或者第一个项目尾部与容器尾部对齐,最后一个项目前导是与以 RTL 模式领先的容器对齐