iOS 以编程方式初始化视图而不限制位置

iOS initialise view programmatically without constraining the position

这是我的问题,我有一个仅用作滚动条的滚动视图 scrollExerciseIndex,在此滚动视图中我放置了一个 UIView indexesView 并且我希望它始终位于滚动视图的中心。为此,我使用布局约束:

UIView * indexesView = [[UIView alloc] initWithFrame: CGRectMake(xPosition, 0, dimension*numberIndexes, dimension)]; [self.scrollExerciseIndex addSubview:indexesView]; [self.scrollExerciseIndex setContentSize:CGSizeMake(dimension*numberIndexes, dimension)]; if (xPosition != 0) { NSLayoutConstraint * xCenterConstraint = [NSLayoutConstraint constraintWithItem:indexesView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.scrollExerciseIndex attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]; [self.scrollExerciseIndex addConstraint:xCenterConstraint]; }

这是预期的结果:

不要关注所有的元素,就屏幕底部的栏是我的问题。

我必须以编程方式创建视图,因为有时我会激活约束,有时不会,而且我必须动态设置视图的框架。所以现在我像这样初始化视图 indexesViewUIView * indexesView = [[UIView alloc] initWithFrame: CGRectMake(xPosition, 0, dimension*numberIndexes, dimension)]; (我知道,不是很原创)

我想知道是否有办法以编程方式初始化视图,但要说自动布局对位置没有限制,因为现在如果屏幕进入横向模式,就会发生冲突,因为滚动视图的框架发生变化,因此滚动视图的中心(我在其上设置了约束)和子视图框架的位置 (xPosition) 之间的距离不再相同。 如您所见,视图不再位于滚动视图的中心,我打破了一些约束。

Will attempt to recover by breaking constraint NSLayoutConstraint:0x7bed6c50 UIView:0x7bed6ad0.centerX == UIScrollView:0x7e273200.centerX

感谢您的帮助。

好的,我通过阅读一本关于音频布局的书找到了我要找的东西。 我的问题是音频布局会自动在我背后产生约束。当使用 AutoLayout 时,一种类型的约束是从非 autoLayout 规范创建的(用于描述不存在自动布局时的界面)。因此约束是使用视图的初始框架创建的。我唯一要做的就是:

[indexesView setTranslatesAutoresizingMaskIntoConstraints:NO];

禁用框架中的约束创建,然后在需要时显式地重新创建 widthheight 的约束(我不是这种情况,但我还是做了测试)像这样:

`NSLayoutConstraint * widthConstraint = [NSLayoutConstraint constraintWithItem:indexesView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0 constant:widthValue];
 NSLayoutConstraint * heightConstraint = [NSLayoutConstraint constraintWithItem:indexesView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0 constant:heightValue];

[indexesView addConstraint: heightConstraint];
[indexesView addConstraint: widthConstraint];`

以编程方式添加约束时,不要忘记调用:[indexesView setNeedsUpdateConstraints];,以便仅在需要时重新计算约束。

我阅读的最后一条信息通常很有用,当添加很多约束时,苹果文档指定使用该方法更有效: [myView addConstraints:(NSArray<NSLayoutConstraints *> *)] 而不是为每个约束调用 addConstraint:

希望对大家有用。