【问题标题】:Move up subviews based on size of UITextView swift根据 UITextView swift 的大小向上移动子视图
【发布时间】:2015-03-31 07:55:21
【问题描述】:

我有一个 UITextView,当用户输入多行文本时它会改变高度。我的问题是,当用户输入足够多的行时,UITextView 会被位于 textview 上方的 UITableView 覆盖。当 textview 的高度增加时,有什么方法可以通过编程方式将 tableview 向上移动?

这是改变textview高度的原因,位于textViewDidChange函数中:

if (self.contentSize.height > self.frame.height && self.contentSize.height < 166){
        self.frame.origin.y -= (self.contentSize.height - self.frame.height)
        self.frame.size = self.contentSize
    }else if (self.contentSize.height < self.frame.height){
        self.frame.origin.y += self.frame.height - self.contentSize.height
        self.frame.size = self.contentSize
    }

【问题讨论】:

  • 我尝试在每次调整 textview 大小时将 textview 的 superview 向上移动,但这会将 textview 与 tableview 一起向上移动...所以这绝对不是答案哈哈
  • 为什么不直接向上移动 tableview 的框架?
  • 因为我正在尝试制作一个消息传递应用程序......如果tableview太高看起来不太好
  • 但是您问“当 textview 的高度增加时,有没有办法以编程方式将 tableview 向上移动?”
  • 我刚刚写了一个带有 iMessage 风格 textview 的应用程序,它就是您想要做的,它位于底部,然后使用键盘进行动画处理。

标签: ios swift uitextview


【解决方案1】:

如果您使用故事板,您可以使用 NSLayoutConstraints 轻松完成此操作,您也可以在代码中执行此操作,但在 stroyboard 中会更容易。如果 textview 在底部,您可以从它 ctrl-drag 到 tablview 并使用垂直间距。对于 iMessage 样式的 textview,使用带有布局约束的将 textview 固定到 VC 视图的底部,并将其顶部固定到 tableview 的底部。您必须在 VC 中注册 UIKeyBoardWillHide 和 UIKeyboardWillShow。然后实现一个类似底部的方法。您可以在 viewDidAppear 中添加观察者,并在 viewWillDisappear 中删除它们。以下方法中的height变量是指我在textView的高度上设置的约束,bottomConstraint是我在storyboard中设置的textView的bottomConstraint的IBOutlet。

` func键盘切换(通知:NSNotification){

    let info:AnyObject = notification.userInfo!
    let keyboardHeight = (info[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue().height
    let duration = info[UIKeyboardAnimationDurationUserInfoKey] as Double

    var height:CGFloat!
    var botConst: CGFloat!


    switch notification.name {

    case UIKeyboardWillShowNotification:
        height = textView.contentSize.height
        botConst = keyboardHeight

    case UIKeyboardWillHideNotification:
        height = 40.0
        botConst = 0.0
        characterCountLabel.hidden = true
                bottomConstraint.constant = botConst
    view.layoutIfNeeded()
    delegate.view.layoutIfNeeded()

    UIView.animateWithDuration(duration, animations: { () -> Void in
        self.view.layoutIfNeeded()
        self.delegate.view.layoutIfNeeded()

    })

`

【讨论】:

  • 我假设您的意思是“界面构建器”而不是“故事板”,因为您也可以使用 xibs 这样做?
  • 这会调整我的 textview 的高度,直到我向其中添加文本......也许我做错了。我可以再试一次
  • NSLayoutConstraint 将是最简单的方法,无论您选择在代码中还是在 ib 中。是的,您也可以在 xib 中执行此操作,但情节提要对初学者更友好。
  • 它不应该影响你的 textView 的高度,除非你设置了那个约束。我注意到使用约束的唯一缺点是,如果在达到时反弹的文本视图上设置最大高度。
【解决方案2】:

我最终采取了与上述答案略有不同的方法。我使用 NSNotificationCenter 发送一个通知,通知文本已输入到 textview,然后我更新了 textview 的大小并更新了 tableview 的 y 坐标。

这是更新我的 textview 和 tableview 位置的函数:

func keyPressed(sender: NSNotification) {

    if let text = textView{
        if let messages = messageViews{

            if (text.contentSize.height > text.frame.height){
                messages.frame.origin.y -= (text.contentSize.height - text.frame.height)
                text.frame.origin.y -= (text.contentSize.height - text.frame.height)
                text.frame.size = text.contentSize
            }else if(text.contentSize.height < text.frame.height){
                messages.frame.origin.y += (text.frame.height - text.contentSize.height)
                text.frame.origin.y += (text.frame.height - text.contentSize.height)
                text.frame.size = text.contentSize
            }
        }
    }
}

【讨论】:

  • 嘿伙计,你自己尝试事情真是太好了,这是唯一的学习方式,但我觉得提到 NSNotifications 弊大于利。您使用的第一个方法是委托方法 textViewDidChange,这是处理此问题的正确位置。我花了一些时间来理解委托,所以我将尝试使用一个简单的类比。想象你在你的车里。附近的每辆车都可以将其收音机调到 100 频道并听到相同的消息,这是一个通知,它是一对多的。现在你的车也有一个气体传感器,可以向……发送信息。
  • 这是我让它工作的唯一方法......约束对我不起作用。但也许我以错误的方式设置它们。约束是委托方法吗?我对此很陌生,所以请原谅我的无知
  • 您的仪表板。没有其他汽车可以看到这一点,也没有其他汽车真正关心您有多少油,这是代表团,一对一。我想您可能会争辩说 tableView 也关心,但实际上 viewController 是唯一关心的,它是“代表”。我只是告诉您在 iOS 中执行此操作的“标准”方式,但编程的美妙之处在于您可以发挥创造力,所以做您认为最适合您的事情;最终,随着你变得更好,你应该尝试更多地关注标准。
  • 我明白了。我说的委托是textView和ViewController之间的关系。就像我说的,刚开始学习时,让它发挥作用通常比做“正确”更重要。所以不要太担心,但请查看链接delegationconstraints,第二个是一个很棒的学习网站,你应该看看他们的一些教程。
  • 好的。谢谢你的建议!
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
相关资源
最近更新 更多