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];
}
这是预期的结果:
不要关注所有的元素,就屏幕底部的栏是我的问题。
我必须以编程方式创建视图,因为有时我会激活约束,有时不会,而且我必须动态设置视图的框架。所以现在我像这样初始化视图 indexesView
:
UIView * 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];
禁用框架中的约束创建,然后在需要时显式地重新创建 width
和 height
的约束(我不是这种情况,但我还是做了测试)像这样:
`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:
。
希望对大家有用。
这是我的问题,我有一个仅用作滚动条的滚动视图 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];
}
这是预期的结果:
不要关注所有的元素,就屏幕底部的栏是我的问题。
我必须以编程方式创建视图,因为有时我会激活约束,有时不会,而且我必须动态设置视图的框架。所以现在我像这样初始化视图 indexesView
:
UIView * 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];
禁用框架中的约束创建,然后在需要时显式地重新创建 width
和 height
的约束(我不是这种情况,但我还是做了测试)像这样:
`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:
。
希望对大家有用。