【问题标题】:iOS initialise view programmatically without constraining the positioniOS以编程方式初始化视图而不限制位置
【发布时间】:2016-01-29 15:12:42
【问题描述】:

这是我的问题,我有一个滚动视图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)]; (我知道,不是很原创)

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

将尝试通过打破约束来恢复 NSLayoutConstraint:0x7bed6c50 UIView:0x7bed6ad0.centerX == UIScrollView:0x7e273200.centerX

感谢您的帮助。

【问题讨论】:

  • 您遇到的具体问题是什么?
  • 感谢您的快速反应,我在这里放了新的屏幕截图,因为我意识到另一个没有解释太多
  • 你能添加整个代码,包括创建滚动视图的代码吗?
  • 也许你也应该read this
  • 我已经添加了创建子视图和设置滚动视图内容的代码,但是滚动视图本身是在 IB 中创建的

标签: ios autolayout constraints


【解决方案1】:

好的,我通过阅读有关音频布局的书找到了我想要的东西。 我的问题是音频布局会自动在我背后产生约束。使用 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:

希望它对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多