【问题标题】:How to change the render order of UIImageViews created in Storyboard如何更改在 Storyboard 中创建的 UIImageViews 的渲染顺序
【发布时间】:2018-07-14 12:06:06
【问题描述】:

我正在开发一个使用 Swift 4 创建字符的 iPhone 应用程序。

关于这个应用程序:在 Storyboard 上,我创建了一些 UIImageViews,它们相互叠加呈现,代表角色的某些部分,例如袜子、鞋子、裤子、衬衫。然后我在代码中结合所有这些层来创建完整的角色。我在用户界面中有用于选择类别的按钮。选择类别后,我会在 UICollectionView 中显示角色可以穿的所有可能物品。然后用户从这个集合中选择一个项目,因此相应的图像会相应地发生变化。

问题:因为我已经使用 Storyboard 创建了这些 UIImageViews,所以它们在渲染时已经有顺序。但有时项目必须以不同的顺序呈现。例如,有时鞋子必须在裤子上渲染,就像穿着紧身牛仔裤一样,而其他时候鞋子必须在裤子下面渲染,就像穿着靴子牛仔裤一样。有时用户不想将图层一直带到顶部,而是在某些特定图层之间。

我想让用户能够更改项目的呈现顺序或将它们向上或向下移动一层。

解决这个问题的好方法是什么?

提前感谢您的回答。

【问题讨论】:

    标签: ios user-interface uiview uiimageview swift4


    【解决方案1】:

    UIView 从头到尾呈现子视图。因此后子视图覆盖前子视图。有几种方法可以更改子视图的顺序。您可以使用bringSubview(toFront:)

    view.bringSubview(toFront: shoeView)
    

    最终将渲染子视图shoeView,使其位于view 的所有其他子视图之上。

    如果你想移动一个视图,你可以使用insertSubview(_:at:)。如果视图始终是子视图,则只需将其移动到新索引。

    【讨论】:

    • @celemens,这很有帮助,但我需要一种在两层之间放置一层的方法,或者正好在第 X 层之后。这不存在,对吧?我们必须自己写。
    • @tiw:我已经扩展了我的帖子。
    【解决方案2】:

    您必须以编程方式执行此操作,我认为最好的方法是将@IBOutlets 保留给那些UIImageViews,然后在适当的时候将它们的顺序切换到它们的superview.subviews - 视图使用它的子视图的顺序来确定渲染它们的顺序。

    所以只是为了说明一个简短的例子:

    @IBOutlet var shoesImageView: UIImageView!
    @IBOutlet var pantsImageView: UIImageView!
    
    @IBAction func putShoesOnTop() {
        let superView = shoesImageView.superview!
        superView.bringSubview(toFront: shoesImageView)
    }
    
    @IBAction func putPantsOnTop() {
        let superView = pantsImageView.superview!
        superView.bringSubview(toFront: pantsImageView)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 2021-05-01
      • 2016-08-08
      • 1970-01-01
      相关资源
      最近更新 更多