2

I'm experiencing a weird bug with the appearance of my inputAccessoryView. While in the middle of a transition, it appears like so:

Mid-transition

After the transition, it appears as it should:

enter image description here

I override the property like so:

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

        return composeView
    }
}

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

Thanks!

EDIT

Here's 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)
            )
        }
    }
}
HighFlyingFantasy
  • 3,789
  • 2
  • 26
  • 38

1 Answers1

2

This is iOS8 issue with inputAccessoryView autolayout. Issue is that UIToolbar's subview of clas _UIToolbarBackground is not positioned properly during initial layout. Try to do next things:

  1. Make CommentComposeView subclassing UIView, not UIToolbar, add instance of UIToolbar as subview.
  2. Use autolayout masks (not actual constraints) inside your CommentComposeView
  3. Override -layoutSubviews in your CommentComposeView like this:
- (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);
} 
General Failure
  • 2,421
  • 4
  • 23
  • 49
Nikita Ivaniushchenko
  • 1,425
  • 11
  • 11
  • I did all that you suggested and I'm still experiencing the same issue. Do you have example code from your experimentation? – HighFlyingFantasy Sep 09 '14 at 14:36
  • Sorry, my fault here, seems like there is no fix for that. When you perform slide-to-pop gesture, background of toolbar also becomes transparent. Also, there your view controller is not deallocated when you use input accessory view and pop back. – Nikita Ivaniushchenko Sep 10 '14 at 10:51
  • I had a similar problem (`UIToolbar` appearing black during `viewWillDisappear`) step 1 of your answer resolved this issue for me. I also set the containing `UIView`'s background color to white. – Pouria Almassi Mar 11 '15 at 02:55
  • 1
    This solution worked for me http://stackoverflow.com/questions/34289951/inputaccessoryviews-uitoolbar-turns-black-when-rotating-in-ios – Josh Bernfeld Sep 02 '16 at 01:05