UIView.animateWithDuration Not Animating Swift (again)
<p>Note: I’ve already checked the following stack overflow issues:</p>

<p><a href="https://stackoverflow.com/questions/27907570">27907570</a>, <a href="https://stackoverflow.com/questions/32229252">32229252</a>, <a href="https://stackoverflow.com/questions/26118141">26118141</a>, <a href="https://stackoverflow.com/questions/31604300">31604300</a></p>

<p>All I am trying to do is fade animate in a view (by alpha) when called by an IBAction attached to a button. Then reverse when a button on the view is hit.</p>

<p>My wrinkle may be that I'm using a secondary view that is on the ViewDock in the storyboard View. The view is added to the subview at the time of viewDidLoad where the frame/bounds are set to the same as the superview (for a full layover)</p>

<p>The reason this is done as an overlay view since it is a tutorial indicator.</p>

<p>The result (like many others who've listed this problem) is that the view (and contained controls) simply appears instantly and disappears as instantly. No fade.</p>

<p>I have tried animationWithDuration with delay, with and without completion, with transition, and even started with the old UIView.beginAnimations.</p>

<p>Nothing is working. Suggestions warmly welcomed.</p>

<p>The code is about as straight forward as I can make it:<br />
<strong>Edit:</strong> Expanded the code to everything relevant<br />
<strong>Edit2:</strong> TL;DR Everything works with the exception of UIViewAnimateWithDuration which seems to ignore the block and duration and just run the code inline as an immediate UI change. <em>Solving this gets the bounty</em></p>

<pre><code>@IBOutlet var infoDetailView: UIView! // Connected to the view in the SceneDock

override func viewDidLoad() {
    super.viewDidLoad()

    // Cut other vDL code that isn't relevant

    setupInfoView()
}

func setupInfoView() {
    infoDetailView.alpha = 0.0
    view.addSubview(infoDetailView)
    updateInfoViewRect(infoDetailView.superview!.bounds.size)
}

func updateInfoViewRect(size:CGSize) {
    let viewRect = CGRect(origin: CGPointZero, size: size)

    infoDetailView.frame = viewRect
    infoDetailView.bounds = viewRect

    infoDetailView.layoutIfNeeded()
    infoDetailView.setNeedsDisplay()
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    updateInfoViewRect(size)
}

func hideInfoView() {
    AFLog.enter(thisClass)
    UIView.animateWithDuration(
        2.0,
        animations:
        {
            self.infoDetailView.alpha = 0.0
        },
        completion:
        { (finished) in
            return true
        }
    )
    AFLog.exit(thisClass)
}

func showInfoView() {
    AFLog.enter(thisClass)
    UIView.animateWithDuration(
        2.0,
        animations:
        {
            self.infoDetailView.alpha = 0.75
        },
        completion:
        { (finished) in
            return true
        }
    )
    AFLog.exit(thisClass)
}

// MARK: - IBActions

@IBAction func openInfoView(sender: UIButton) {
    showInfoView()
}

@IBAction func closeInfoView(sender: UIButton) {
    hideInfoView()
}
</code></pre>

<p>Please note, I started with the following:</p>

<pre><code>func showInfoView() {
    UIView.animateWithDuration(2.0, animations: { () -&gt; Void in
        self.infoDetailView.alpha = 0.75
    })
}

func hideInfoView() {
    UIView.animateWithDuration(2.0, animations: { () -&gt; Void in
        self.infoDetailView.alpha = 0.00
    })
}
</code></pre>