Слайд UIInputView с UIViewController, например Slack

Я хотел бы использовать входной аксессуар UIViewController следующим образом:

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

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

но проблема в том, что у меня есть ящик, похожий на вид, и когда я открываю вид, входной вид остается в окне. Как я могу сохранить представление ввода в центральном представлении, как это делает Slack.

введите здесь описание изображения

Где мое представление ввода остается внизу, занимая полный экран (красный — это представление ввода на изображении ниже):

введите здесь описание изображения


person SirRupertIII    schedule 25.10.2015    source источник
comment
Если представление slack скользит, то, вероятно, они не устанавливают его как inputAccessoryView. Вероятно, они просто управляют его местоположением «вручную» в коде.   -  person rob mayoff    schedule 25.10.2015
comment
Да, может быть. Но если вы используете Slack, поднимите клавиатуру и проведите пальцем вниз в представлении таблицы, клавиатура начнет опускаться, как только вы нажмете верхнюю часть представления ввода. Это заставляет меня думать, что это входное представление, и им не управляют вручную.   -  person SirRupertIII    schedule 25.10.2015
comment
Разве это не указывает только на то, что они установили tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag или UIScrollViewKeyboardDismissModeInteractive?   -  person rob mayoff    schedule 25.10.2015
comment
Да, они тоже так делают, но потому что я управляю своим «входным представлением» вручную, и клавиатура не скользит вниз, как только я достигаю самого верха своего вида ввода. Он скользит вниз, как только я достигаю верхней части клавиатуры. Slack действует как настоящий вид ввода, потому что клавиатура начинает скользить вниз, как только я нажимаю верхнюю часть окна ввода.   -  person SirRupertIII    schedule 25.10.2015
comment
Я действительно думаю, что они берут рамку клавиатуры и изменяют ее, а не используют UIScrollViewKeyboardDismissModeInteractive. github.com/slackhq/SlackTextViewController/blob/   -  person SirRupertIII    schedule 25.10.2015
comment
Это решает мою проблему, я думаю.   -  person SirRupertIII    schedule 25.10.2015


Ответы (1)


Есть два способа сделать это точно так же, как это делает Slack: Meiwin опубликовал сообщение на Medium здесь Сторож для подробностей : Внедрение Sticky Input Field в iOS, чтобы показать, как ему удалось это сделать, что он на самом деле помещает пустой UIView как inputAccessoryView, а затем отслеживает его координаты на экране, чтобы знать, куда поместить его собственное представление по отношению к пустому представлению, этот способ может быть полезен, если вы собираетесь поддерживать SplitViewController на iPad, но если вы не заинтересованы в этом, вы можете увидеть, как мне удалось это сделать, как на этом изображении.

Вот перед смахиванием

Вот после

Все, что я сделал, это сделал снимок из окна inputAccessoryView и поместил его на NavigationController окна TableViewController.

Я использую SideMenu из Джон Кент, и это довольно легко сделать с помощью 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
}

Надеюсь, это поможет :)

person Amr Mohamed    schedule 17.10.2018