Swift inputAccessoryView 覆盖错误

Posted

技术标签:

【中文标题】Swift inputAccessoryView 覆盖错误【英文标题】:Swift inputAccessoryView override bug 【发布时间】:2014-08-07 17:12:42 【问题描述】:

我的inputAccessoryView 出现时遇到了一个奇怪的错误。在过渡期间,它看起来像这样:

过渡后,它应该是这样的:

我像这样覆盖属性:

    override var inputAccessoryView: UIView! 
    get 
        if composeView == nil 
            composeView = CommentComposeView(frame: CGRectMake(0, 0, 0, MinimumToolbarHeight - 0.5))
            self.setupSignals()
        

        return composeView
    

我想知道是否有人可以指出我正在做的事情中的任何明显缺陷,或者提供更多信息来说明如何确保我的视图在转换之前、期间和之后按应有的方式显示。

谢谢!

编辑

这是我的CommentComposeView

import UIKit

class CommentComposeView: UIToolbar 
    var textView: SAMTextView!
    var sendButton: UIButton!

    private var didSetConstraints: Bool = false

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.initialize()
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        self.initialize()
    

    private func initialize() 
        textView = SAMTextView(frame: CGRectZero)
        sendButton = UIButton.buttonWithType(.System) as UIButton

        self.barStyle = .Black
        self.translucent = true

        textView.backgroundColor = UIColor.presentOffWhite()
        textView.font = UIFont.presentLightMedium()
        textView.layer.borderWidth = 0.5
        textView.layer.cornerRadius = 5
        textView.placeholder = "Comment"
        textView.scrollsToTop = false
        textView.textContainerInset = UIEdgeInsetsMake(4, 3, 3, 3)
        textView.keyboardAppearance = .Dark
        textView.keyboardType = .Twitter
        self.addSubview(textView)

        sendButton = UIButton.buttonWithType(.System) as UIButton
        sendButton.enabled = false
        sendButton.titleLabel!.font = UIFont.presentBoldLarge()
        sendButton.setTitle("Send", forState: .Normal)
        sendButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        sendButton.setTitleColor(UIColor.presentCyan(), forState: .Highlighted)
        sendButton.setTitleColor(UIColor.presentLightGray(), forState: .Disabled)
        sendButton.contentEdgeInsets = UIEdgeInsetsMake(6, 6, 6, 6)
        self.addSubview(sendButton)

        RAC(self.sendButton, "enabled") <~ self.textView.rac_textSignal()
            .map  text in
                return (text as NSString).length > 0
        

        textView.setTranslatesAutoresizingMaskIntoConstraints(false)
        sendButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    

    override func updateConstraints() 
        super.updateConstraints()

        if !didSetConstraints 
            // TODO: Replace raw constraints with a friendlier looking DSL
            self.addConstraint(
                NSLayoutConstraint(item: textView, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1, constant: 8)
            )

            self.addConstraint(
                NSLayoutConstraint(item: textView, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 7.5)
            )

            self.addConstraint(
                NSLayoutConstraint(item: textView, attribute: .Right, relatedBy: .Equal, toItem: sendButton, attribute: .Left, multiplier: 1, constant: -2)
            )

            self.addConstraint(
                NSLayoutConstraint(item: textView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: -8)
            )

            self.addConstraint(
                NSLayoutConstraint(item: sendButton, attribute: .Right, relatedBy: .Equal, toItem: self, attribute: .Right, multiplier: 1, constant: 0)
            )

            self.addConstraint(
                NSLayoutConstraint(item: sendButton, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: -4.5)
            )
        
    

【问题讨论】:

如果此问题仍然是最新的,请提供完整的示例。您在哪些 ios 版本上遇到过此问题? iOS 8。您还需要什么?我的实际CommentComposeView 【参考方案1】:

这是 iOS8 的 inputAccessoryView 自动布局问题。问题是 UIToolbar 的 clas _UIToolbarBackground 子视图在初始布局期间未正确定位。尝试做接下来的事情:

    使CommentComposeView 子类化UIView,而不是UIToolbar,添加UIToolbar 的实例作为子视图。 在CommentComposeView 中使用自动布局掩码(不是实际约束) 在您的CommentComposeView 中覆盖-layoutSubviews,如下所示:
- (void)layoutSubviews

    [super layoutSubviews];

    contentToolbar.frame = self.bounds;
    sendButton.frame = CGRectMake(0.f, 0.f, 44.f, self.bounds.size.height);
    textView.frame = CGRectMake(44.f, 0.f, self.bounds.size.width - 44.f, self.bounds.size.height);
 

【讨论】:

我按照你的建议做了所有的事情,但我仍然遇到同样的问题。你有实验中的示例代码吗? 对不起,我的错在这里,似乎没有解决办法。当您执行滑动弹出手势时,工具栏的背景也会变得透明。此外,当您使用输入附件视图并弹回时,您的视图控制器不会被释放。 我遇到了类似的问题(UIToolbarviewWillDisappear 期间出现黑色)您回答的第 1 步为我解决了这个问题。我还将包含UIView 的背景颜色设置为白色。 这个解决方案对我有用***.com/questions/34289951/…

以上是关于Swift inputAccessoryView 覆盖错误的主要内容,如果未能解决你的问题,请参考以下文章

swift如何将inputAccessoryView停靠在UIToolbar上方(不是底部)

Swift inputAccessoryView 覆盖错误

如何在 inputAccessoryView [Swift] 中实现滚动视图

旋转后Swift inputAccessoryView未附加到键盘

如何使用 Swift 在 CustomCell 中实现 inputAccessoryView 到 UITextField?

ios8 swift:我如何访问/编辑/删除默认/私有 inputAccessoryView 高度约束'_UIKBAutolayoutHeightConstraint'