Hiding/Showing 输入附件视图

Hiding/Showing Input Accessory View

我有一个自定义 inputAccessoryView 并且正在尝试切换 hiding/showing 它。我不想使用 .isHidden.removeFromSuperView(),而是使用底部幻灯片 in/out,这似乎是原生的,因为我将其他 viewControllers 呈现到层次结构中,而这个动画执行。

我已经尝试 resignFirstResponder 但没有成功,并且似乎没有关于此的任何现有评论。任何想法都将不胜感激,因为我确实被难住了。

class CustomInputAccessoryView: UIView {

let customTextView: CustomInputTextView = {
    let tv = CustomInputTextView()
    tv.isScrollEnabled = false
    return tv
}()

override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = UIColor.white
    autoresizingMask = .flexibleHeight

    addSubview(customTextView)
    customTextView.topAnchor.constraint(equalTo: topAnchor, constant: 12).isActive = true
    customTextView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: 8).isActive = true
    customTextView.leftAnchor.constraint(equalTo: leftAnchor, constant: 10).isActive = true
    customTextView.rightAnchor.constraint(equalTo: rightAnchor, constant: 10).isActive = true
    customTextView.heightAnchor.constraint(greaterThanOrEqualToConstant: frame.height - 20).isActive = true
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override var intrinsicContentSize: CGSize {
    return .zero
}
}

class CustomInputTextView: UITextView {
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
    }

    override var canResignFirstResponder: Bool {
        return true
    }

    override var canBecomeFirstResponder: Bool {
        return true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init coder has not been implemented")
    }
}

//in viewcontroller
lazy var inputContainerView: CustomInputAccessoryView = {
    let frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 60)
    let customInputAccessoryView = CustomInputAccessoryView(frame: frame)
    return customInputAccessoryView
}()        

//onLoad
override var inputAccessoryView: UIView? {
    get { return inputContainerView }
}

我不知道这是否真的是您想要的,但请尝试一下。

点击视图中的任意位置将show/hide输入附件视图:

class TestInputViewController: UIViewController {

    //in viewcontroller
    lazy var inputContainerView: CustomInputAccessoryView = {
        let frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 60)
        let customInputAccessoryView = CustomInputAccessoryView(frame: frame)
        return customInputAccessoryView
    }()

    override var canBecomeFirstResponder: Bool {
        return true
    }

    //onLoad
    override var inputAccessoryView: UIView? {
        get { return inputContainerView }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // so we can see the frame
        inputContainerView.backgroundColor = .blue

        // tap anywhere in view to show / hide input accessory view
        let g = UITapGestureRecognizer(target: self, action: #selector(didTap(sender:)))
        view.addGestureRecognizer(g)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }

    @objc func didTap(sender: UITapGestureRecognizer) {
        if self.isFirstResponder {
            resignFirstResponder()
        } else {
            becomeFirstResponder()
        }
    }

}

class CustomInputAccessoryView: UIView {

    let customTextView: CustomInputTextView = {
        let tv = CustomInputTextView()
        tv.isScrollEnabled = false
        return tv
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = UIColor.white
        autoresizingMask = .flexibleHeight

        addSubview(customTextView)
        customTextView.translatesAutoresizingMaskIntoConstraints = false
        customTextView.topAnchor.constraint(equalTo: topAnchor, constant: 12).isActive = true
        customTextView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor, constant: -8).isActive = true
        customTextView.leftAnchor.constraint(equalTo: leftAnchor, constant: 10).isActive = true
        customTextView.rightAnchor.constraint(equalTo: rightAnchor, constant: -10).isActive = true
        customTextView.heightAnchor.constraint(greaterThanOrEqualToConstant: frame.height - 20).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var intrinsicContentSize: CGSize {
        return .zero
    }
}

class CustomInputTextView: UITextView {
    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
    }

    override var canResignFirstResponder: Bool {
        return true
    }

    override var canBecomeFirstResponder: Bool {
        return true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init coder has not been implemented")
    }
}

与显示/隐藏无关,但您的一些约束是错误的,导致文本视图错位。