如何为视图控制器的视图提供多个位置状态?

2024-02-17

我试图解决的问题是:我有一个DetailViewController显示我的模型的数据UIImageView's, UITextFields's, etc.

如果用户点击一个按钮,那些DetailViewController的视图移动到不同的位置并开始可编辑。可编辑时,如果用户点击其中之一UITextField(只有其中之一是特殊的)UITextField移至屏幕顶部并显示UITableView似乎会自动完成它(就像您在谷歌上输入某些内容时一样)。

用户还可以点击同一按钮返回到显示状态(没有任何内容可编辑)。

所以基本上我有一些看法ViewController有 3 种可能的状态:DisplayState, EditingState, EditingWithFocusOnSpecialTextFieldsState.

我想要所有描述的定位状态NSLayoutConstraints,并且,如果可能的话,就在故事板中。

我能做的一件事就是这个动画化故事板状态/位置 https://stackoverflow.com/questions/22903571/animate-to-a-storyboard-state-position,但这涉及到在代码中编写每个状态的每个约束,因此我在开发时无法在故事板中很好地可视化它们(而且,在代码中编写约束比在故事板中编写约束的可维护性要差得多)。

例如,我想要创建 3 个不同的 XIB,或者我的 XIB 的不同副本DetailViewController在故事板中,每个子视图有 3 个不同的位置,然后在它们之间进行动画处理。

如果有什么区别的话,我总是使用最新的 iOS 版本(现在是 iOS 8)和 Swift。 如果你不想用 Swift 回答的话,我也非常了解 Objective-C。


据我所知,没有办法用 3 个不同的视图来做到这一点,并得到你想要的结果(至少没有直接的方法)。一种方法是对您需要为每个视图调整的超级视图的任何一个边缘设置 3 个约束(每个状态一个)(除了您不需要修改的任何其他约束之外)。其中一个具有高优先级(我使用的是 900,不可能是 1000),另外 2 个具有较低优先级(在我的示例中为 499)。当您切换状态时,您会更改 3 个状态中哪一个具有高优先级。这确实涉及到很多约束,我发现实现代码切换的最简单方法是在 IB 中给出约束标识符(您可以在身份检查器的“用户定义的运行时属性”部分中执行此操作)。这种方法意味着我不必为所有这些限制创建 IBOutlet。这是故事板中有两个视图的示例,

您可以看到文本字段有 3 个顶部约束,图像视图有 3 个 centerY 约束(尽管您看不到有 3 个)。每个约束(以 3 个为一组)的标识符设置为“显示”、“编辑”或“焦点”。我为名为“显示”的优先级指定 900,另外 2 个为 499(因为我希望视图以显示模式启动)。在此测试应用程序中,我使用 3 个按钮来更改状态,当然,您可以使用其他方法来完成此操作。这是我用来切换优先级的代码,

enum EditState: String {
    case Display = "display" // these strings are the same as the ones assigned to the identifier property of the constraints in IB (in "user defined runtime attributes")
    case Editing = "edit"
    case EditWithFocus = "focus"
}

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    func updatEditingState(state: EditState) {
        var constraintsArray = self.view.constraints() as [NSLayoutConstraint]
        constraintsArray += self.imageView.constraints() as [NSLayoutConstraint]

        for con in constraintsArray {
            if let name = con.identifier? {
                if name == "display" || name == "edit" || name == "focus" {
                    con.priority = (name == state.rawValue) ? 900 : 499
                }
            }
        }

        UIView.animateWithDuration(0.5) {self.view.layoutIfNeeded()}
}


    @IBAction func EnterEditingState(sender: UIButton) {
        updatEditingState(EditState.Editing)
    }


    @IBAction func enterDisplayStatus(sender: UIButton) {
        updatEditingState(EditState.Display)
    }


    @IBAction func enterFocusStatus(sender: UIButton) {
        updatEditingState(EditState.EditWithFocus)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为视图控制器的视图提供多个位置状态? 的相关文章

随机推荐