【问题标题】:Slide UIInputView with UIViewController like Slack使用 UIViewController 滑动 UIInputView,如 Slack
【发布时间】:2016-01-24 10:11:58
【问题描述】:

我想像这样使用 UIViewController 的输入附件视图:

override func canBecomeFirstResponder() -> Bool {
    return true
}

override var inputAccessoryView: UIView! {
    return self.bar
}

但问题是我有一个类似视图的抽屉,当我滑动打开视图时,输入视图停留在窗口上。如何像 Slack 一样将输入视图保持在中心视图上。

我的输入视图位于底部,占据全屏(下图中红色为输入视图):

【问题讨论】:

  • 如果 slack 的视图滑过,那么他们可能没有将其设置为 inputAccessoryView。他们可能只是在代码中“手动”管理其位置。
  • 是的,也许。但是如果你使用 Slack,在 table view 上抬起键盘并向下滑动,一旦你点击 input view 的顶部,键盘就会开始向下滑动。这让我觉得这是一个输入视图,不是手动管理的。
  • 这不只是表明他们设置了tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDragUIScrollViewKeyboardDismissModeInteractive吗?
  • 是的,他们也这样做,但是因为我手动管理我的“inputView”,并且一旦我到达输入视图的最顶部,键盘就不会向下滑动。一旦我到达键盘顶部,它就会向下滑动。 Slack 的行为就像一个真正的输入视图,因为只要我点击输入视图的顶部,键盘就会开始向下滑动。
  • 我实际上认为他们抓住了键盘的框架并改变了它,而不是使用 UIScrollViewKeyboardDismissModeInteractive。 github.com/slackhq/SlackTextViewController/blob/…

标签: ios first-responder inputview inputaccessoryview


【解决方案1】:

有两种方法可以做到这一点,就像 Slack 一样,Meiwin 在这里有一个中等帖子 A Stickler for Details: Implementing Sticky Input Field in iOS 来展示他是如何做到这一点的,他实际上把一个空的 UIView 作为 inputAccessoryView 然后跟踪它在屏幕上的坐标以了解将他的自定义视图与空视图相关的位置,如果您要在 iPad 上支持SplitViewController,这种方式会很有帮助,但如果您对这种方式不感兴趣,您可以查看我是如何做到像这张图片一样的

这里是刷卡之前

这是之后

实际上我所做的只是从inputAccessoryView 窗口拍摄快照并将其放在TableViewControllerNavigationController

我正在使用来自Jon KentSideMenu,使用UISideMenuNavigationControllerDelegate 很容易做到这一点

var isInputAccessoryViewEnabled = true {
    didSet {
        self.inputAccessoryView?.isHidden = !self.isInputAccessoryViewEnabled
        if self.isInputAccessoryViewEnabled {self.becomeFirstResponder()}
    }
}

func sideMenuWillAppear(menu: UISideMenuNavigationController, animated: Bool) {
    let inputWindow = UIApplication.shared.windows.filter({$0.className == "UITextEffectsWindow"}).first
    self.inputAccessoryViewSnapShot = inputWindow?.snapshotView(afterScreenUpdates: false)
    if let snapShotView = self.inputAccessoryViewSnapShot, let navView = self.navigationController?.view {
        navView.addSubview(snapShotView)
    }

    self.isInputAccessoryViewEnabled = false
}

func sideMenuDidDisappear(menu: UISideMenuNavigationController, animated: Bool) {
    self.inputAccessoryViewSnapShot?.removeFromSuperview()        
    self.isInputAccessoryViewEnabled = true
}

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2013-02-17
    • 2014-09-15
    • 2013-07-20
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多