Swift:锁定按钮位置,因为它正在被 UITextview 移动?约束问题?

Posted

技术标签:

【中文标题】Swift:锁定按钮位置,因为它正在被 UITextview 移动?约束问题?【英文标题】:Swift: Lock button position because it is being moved by UITextview? Problems with constraints? 【发布时间】:2016-06-08 04:47:03 【问题描述】:

我已经到了最后期限,并且已经花了 5 多个小时试图让它工作 - 我遇到了 UITextview 和移动按钮的问题。我还没有找到 1 个有同样问题的答案或帖子。

我在 xib 上放置了一个 unbutton 和一个 uitextview。这些通过“添加缺失约束”按钮在所有设备上“锁定”到位。起初,我将 Unbutton 放在文本字段上(它们的大小相同)。

我有一个函数可以将 UIButton 向上(在 uitextview 上方)或向下(在 textview 上方)移动,具体取决于它是否已被按下:

 @IBAction func enterText(sender: UIButton) 
        print("time to enter text")

        if !textOpen
        
        UIView.animateWithDuration(0.5, animations: 
            self.textBtn.center.y -= self.textBtn.bounds.height
        )


        
        else 
            UIView.animateWithDuration(0.5, animations: 
                self.textBtn.center.y += self.textBtn.bounds.height
            )

        

        textOpen = !textOpen
    

这是移动 Uibutton 的唯一代码。只有一块。 我正在尝试实现这种效果 - 当按下按钮时,向上移动以显示 textview,以便用户可以编辑文本。再次按下,按钮移回文本视图。像这样:

但是我遇到了一个非常大的问题。按钮向上移动后,如果用户在 textview 中输入,则按钮会弹回原位。或者有时只是偶尔移动。 textview 没有调用enterText 方法,因为没有打印任何内容。我不知道它是如何移动按钮的。

我最初尝试将按钮向上放置,并且在大多数情况下,textview 导致按钮移回此位置(而不是在它上方),所以我认为 textview 将按钮发送回其原始位置,如自动指示设置的布局约束。我不明白这是如何工作的。

我已经尝试了所有方法 - 尝试将按钮和 textview 锁定在一起,调整 textview 的大小,以编程方式创建按钮以避免处理约束。没有任何工作,我需要尽快完成。没有想法了。

该按钮仅在启用 textview 时回弹 - 如果用户无法键入任何内容都不会受到影响。所以我的最后一根稻草 -

有没有办法在编辑文本视图时锁定屏幕上按钮的位置?我知道有一种方法可以检测是否正在输入文本并尝试手动设置 UIButton 的中心 x 和 y 但同样,我认为约束已经推翻了这一点。

还有其他方法可以配置约束以使其工作吗?或者这种效果是不可能的?

【问题讨论】:

【参考方案1】:

好的,所以您需要移动“告诉我们发生了什么”按钮。这是你可以做的:

1) 使用“拍照”按钮的顶部为该按钮设置底部约束。最初,它的常数为 0。

2) 现在有了这个约束的出口(假设我将它命名为 bottomConst)并执行以下操作:

 @IBAction func enterText(sender: UIButton) 
            print("time to enter text")

            if !textOpen
            
             self.bottomConst.constant = 30 //whatever height your textview has

             self.textBtn.setNeedsUpdateConstraints()

            
            else 

             self.bottomConst.constant = 0 

             self.textBtn.setNeedsUpdateConstraints()

            
           UIView.animateWithDuration(0.5, delay: 0, options: .CurveEaseInOut, animations: 
               self.textBtn.layoutIfNeeded()
, completion: nil)

            textOpen = !textOpen
        

希望对你有帮助。

【讨论】:

以上是关于Swift:锁定按钮位置,因为它正在被 UITextview 移动?约束问题?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 更新和存储多个以编程方式创建的按钮的位置

Swift:在锁定屏幕上添加前进/后退 15 秒按钮

按钮不可聚焦,因为它遥不可及 - tvOS Swift

IBAction 显示纬度和经度(swift)

azurew网站持续部署 - Web Deploy无法修改目标上的文件“XXX”,因为它已被外部进程锁定

文件被哪个进程锁定?