Swift inputAccessoryView error

I am getting a strange error with my inputAccessoryView

. While in the middle of the transition, it looks like this:

Mid-transition

After the transition, it appears as it should:

enter image description here

I am overriding the property like this:

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

        return composeView
    }
}

      

I am wondering if anyone can point out any obvious flaw in what I am doing, or provide more information on how to ensure that my view appears as it should, before, during and after the transitions.

Thank!

EDIT

Here my 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)
            )
        }
    }
}

      

+2


source to share


1 answer


This is an iOS8 issue with autostart inputAccessoryView. The problem is that the clas class UIToolbar substructure is _UIToolbarBackground

not positioned properly during initial layout. Try the following:

  • Make CommentComposeView

    a subclass UIView

    instead UIToolbar

    , add an instance UIToolbar

    as a rootstock.
  • Use auto-detect masks (not actual constraints) internally CommentComposeView

  • Cancel -layoutSubviews

    in the CommentComposeView

    following way:


- (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);
} 

      

+2


source







All Articles