【问题标题】:Setting frame value for all items in IBOutletCollection为 IBOutletCollection 中的所有项目设置框架值
【发布时间】:2015-04-14 10:30:25
【问题描述】:

我创建了一个带有一些 UIElements(标签、按钮、TextField)的 IBOutletCollection,我想在一个特殊事件中移动它们。

这就是我目前所拥有的:

@IBAction func moveDown(sender: UIButton) {
    UIView.animateWithDuration(0.4, animations: {
            for subview in self.moveOutViews {
                var offset = CGFloat(700);
                var newY = subview.frame.origin.y + offset;
                subview.frame = CGRectMake(subview.frame.origin.x, newY, subview.frame.size.width, subview.frame.size.height);
            }
            }, completion: {
                (value: Bool) in
                UIView.commitAnimations();

        });
}

现在我的问题是,当动画完成后,我想与新位置上的 UIElements (TextField) 进行交互,所有视图都“跳转”回到原始位置。

'sender' 可能是 IBOutletCollection 的一部分的问题?

这是适用于 iOS 8.3 的 iPad 应用程序,我正在使用 Swift。

编辑:我用 UIScrollView 做了一个解决方法。但我想知道为什么第一个想法不起作用。

【问题讨论】:

  • 问题可能是您有设置项目位置的约束,一旦重新应用这些约束,您对框架的手动更改就会被覆盖。如果您为第一个项目的 Y 位置约束设置一个 IBOutlet,然后将所有其他项目的 Y 位置设置为与第一个对象对齐,那么您需要做的就是修改约束 IBOutlet 的常量并调用 setNeedsLayout
  • 我没有限制。我已经尝试过你的想法,但仍然是同样的问题。
  • 你为什么在完成块中调用UIView.commitAnimations()?对于基于块的动画,该调用是不必要的
  • 哦,我不知道。

标签: ios swift frame uiviewanimation cgrectmake


【解决方案1】:

由于我们不知道您的视图是如何设置的,我不得不猜测它是以下两种情况之一:

  1. 就像@Paulw11 在他的评论中建议的那样。您正在编辑由约束保持的视图框架。当视图再次布局时,所有视图都会重新回到由约束确定的位置。事件尽管您说您没有使用约束,但可能为您的视图启用了translatesAutoresizingMaskIntoConstraints,或者您的 xib/storyboard 设置为使用约束,因此会自动为您生成约束。检查这一点的一种方法是只记录子视图的constraints 属性。

  2. 您的应用程序中的其他地方有代码正在更改您的视图的位置,并且无意中调用了它。

【讨论】:

  • 如何向您展示视图的设置?第 1 点:日志只显示 (Function) 第 2 点:绝对没有。
  • 如果你使用storyboard/xib你不能显示它。如果是这种情况,请检查是否在情节提要/xib 的Utilities panel (right side) > File Inspector > Interface Builder Document 中选中了“使用自动布局”。否则,只需发布​​您用于创建视图的代码示例。
  • 是的,我正在为该视图使用 xib。选中使用自动布局。
  • 那么您的问题在 1 中说明。要么取消选中 Use Auto Layout,因此您正在使用弹簧和支柱或为约束设置动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多