Aggregate

Kano

Suggested reading for product owners!

Web Services Consumption

RestKit, Argo, ?

TDD

Tutorials

UIPresentationViewController

Object Oriented Programming

Continuous Delivery

Waterfall

Swift

iOS Highlights

Algorithms

iOS things I’m interested in exploring

Scrolling

  • wwdc: pull down scroll views
  • dots scrollviews
  • two direction scroll views

Transitions

  • mail transition
  • google inbox transition
  • swipe both ways transition
  • collection view transition

In Jekyll, how do I print an array to the screen?

{{ product.tags | join: ', ' }}
CSS 

Can I force a span to have a width?

span.post-meta {
   display: inline-block;
   margin-right: 1em;
   width: 100px;
}
Agile Mindset 

What does Kent McDonald have to say about an Agile Mindset?

What are some example custom controls for Cocoa?

Amy Hoy 

What is a good enough launch?

How do I add a target to an iOS button?

myFirstButton.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)

Where can I find more UIButton reference material?

Swift 

Swift Quick Reference

Extensions

extension SomeType {
	// new functionality to add to SomeType goes here
}

Enums

Loops

Tuples

let someTuple: (Double, Double) = (3.14159, 2.71828)

Introspection

import Foundation

class PrintClassName : NSObject {
    override init() {
        super.init()
        println(NSStringFromClass(self.dynamicType))
    }
}

Typealias

Lazy

How do I animated autolayout constraints again?

[containerView layoutIfNeeded];
[UIView animateWithDuration:1.0 animations:^{
  // Make all constraint changes here
  [containerView layoutIfNeeded];
}];

More references

Does someone have an open source library for exanding iOS cells?

Where can I be inspired for iOS applications?

Along the lines of getting a new synth.

  • prototyping tools examples
  • jquery examples
  • dribble

Google Inbox Teardown

Accordion Cells

Where is some good information regarding UIViewController transitions?

objc.io

Vaberer

Even more information about UIViewController transitions!

TIL

  • an UIView animation block will be skipped if there are no animatable properties changing in the block. In my case, animation completion blocks were firing almost immediately.

  • if not already displayed, invoking transitionContext.completeTransition(true) will cause the destination view to display

  • Render View Into Image Faster

Examples

objc.io Issue 5 - View Controller Transitions

    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

        let sourceVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        
        let destinationVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let destinationView = destinationVC.view
        
        let container = transitionContext.containerView()!
        container.addSubview(destinationView)

        destinationVC.view.alpha = 0
        
        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
            sourceVC.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
            destinationVC.view.alpha = 1
        }) { (Success) -> Void in
            sourceVC.view.transform = CGAffineTransformIdentity
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        }
        
    }
	

Google Inbox Style Expanding Cell

    func animateTransition2(transitionContext: UIViewControllerContextTransitioning) {
        let sourceVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let sourceView = sourceVC.view
        
        let destinationVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        let destinationView = destinationVC.view
        
        let container = transitionContext.containerView()!
        
        self.selectedCellFrame = CGRectMake(self.selectedCellFrame.origin.x, self.selectedCellFrame.origin.y + self.selectedCellFrame.height, self.selectedCellFrame.width, self.selectedCellFrame.height)
        
        var snapShot = UIImage()
        let bounds = CGRectMake(0, 0, sourceView.bounds.size.width, sourceView.bounds.size.height)
        
        UIGraphicsBeginImageContextWithOptions(sourceView.bounds.size, true, 0)
        
        if self.operation == UINavigationControllerOperation.Push {
            sourceView.drawViewHierarchyInRect(bounds, afterScreenUpdates: false)
            
            snapShot = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            
            let tempImageRef = snapShot.CGImage!
            let imageSize = snapShot.size
            let imageScale = snapShot.scale

            let midPoint = bounds.height / 2
            let selectedFrame = self.selectedCellFrame.origin.y - (self.selectedCellFrame.height / 2)
            
            let padding = self.selectedCellFrame.height * imageScale
            
            var topHeight: CGFloat = 0.0
            var bottomHeight: CGFloat = 0.0
            
            if selectedFrame < midPoint {
                topHeight = self.selectedCellFrame.origin.y * imageScale
                bottomHeight = (imageSize.height - self.selectedCellFrame.origin.y) * imageScale
            } else {
                topHeight = (self.selectedCellFrame.origin.y * imageScale) - padding
                bottomHeight = ((imageSize.height - self.selectedCellFrame.origin.y) * imageScale) + padding
            }
            
            let topImageRect = CGRectMake(0, 0, imageSize.width * imageScale, topHeight)
            
            let bottomImageRect = CGRectMake(0, topHeight, imageSize.width * imageScale, bottomHeight)

            let topImageRef = CGImageCreateWithImageInRect(tempImageRef, topImageRect)!
            let bottomImageRef = CGImageCreateWithImageInRect(tempImageRef, bottomImageRect)
            
            self.imageViewTop = UIImageView(image: UIImage(CGImage: topImageRef, scale: snapShot.scale, orientation: UIImageOrientation.Up))
            
            if (bottomImageRef != nil) {
                self.imageViewBottom = UIImageView(image: UIImage(CGImage: bottomImageRef!, scale: snapShot.scale, orientation: UIImageOrientation.Up))
            }
        }
        
        var startFrameTop = self.imageViewTop!.frame
        var endFrameTop = startFrameTop
        var startFrameBottom = self.imageViewBottom!.frame
        var endFrameBottom = startFrameBottom
        
        if self.operation == UINavigationControllerOperation.Pop {
            startFrameTop.origin.y = -startFrameTop.size.height
            endFrameTop.origin.y = 0
            startFrameBottom.origin.y = startFrameTop.height + startFrameBottom.height
            endFrameBottom.origin.y = startFrameTop.height
        } else {
            startFrameTop.origin.y = 0
            endFrameTop.origin.y = -startFrameTop.size.height
            startFrameBottom.origin.y = startFrameTop.size.height
            endFrameBottom.origin.y = startFrameTop.height + startFrameBottom.height
        }
        
        self.imageViewTop!.frame = startFrameTop
        self.imageViewBottom!.frame = startFrameBottom
        
        // hide the destination view
        destinationView.alpha = 0
        
        // add the destination view (hidden)
        container.addSubview(destinationView)
        
        // add the fake facade views (match current)
        container.addSubview(self.imageViewTop!)
        container.addSubview(self.imageViewBottom!)
        
        if self.operation == UINavigationControllerOperation.Pop {
            
            UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
                
                // come together!
                self.imageViewTop!.frame = endFrameTop
                self.imageViewBottom!.frame = endFrameBottom
                
                // fade away
                sourceView.alpha = 0

            }, completion: { (finish) -> Void in
                
                // appear behind facade
                destinationView.alpha = 1

                // remove from view (previous line destination view should show up)
                self.imageViewTop!.removeFromSuperview()
                self.imageViewBottom!.removeFromSuperview()

                transitionContext.completeTransition(true)
            })
            
        } else {
            
            // hide the source view (the facade currently covers it up)
            sourceView.alpha = 0
            
            // separate out
            UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
                self.imageViewTop!.frame = endFrameTop
                self.imageViewBottom!.frame = endFrameBottom
                
                // fade the underlying view in
                destinationView.alpha = 1
            
            }, completion: { (finish) -> Void in
                self.imageViewTop!.removeFromSuperview()
                self.imageViewBottom!.removeFromSuperview()
                
                transitionContext.completeTransition(true)
            })
        }
    }

What would I look for in an iOS developer?

Expanding Cells - TableView

Swipable Cells - TableView

Collection View

General Animation

Tech Leads

View Controller Transitions