Swift code snippets

From Hawk Wiki
Revision as of 04:34, 20 March 2015 by Hall (Talk | contribs) (UIGraphics Drawing on UIView)

Jump to: navigation, search

Swift Code snippts

Back To IOS_Swift

Making Network Request

var clientId = "Put your client id here"
 
var url = NSURL(string: "https://api.instagram.com/v1/media/popular?client_id=\(clientId)")!
var request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
    var responseDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil) as NSDictionary
    self.photos = responseDictionary["data"] as NSArray
    self.tableView.reloadData()
    
    println("response: \(self.photos)")
}

Use AFNetworking setImageWithURL

Create the bridging file: create a new Objective-C file, name it anything, and when you save it, Xcode will prompt you generate a bridging file.
In an Objective-C bridging file:

#import <AFNetworking/UIImageView+AFNetworking.h>

In the swift view file, to set a imageView using URL:

setImageWithURL(NSURL(string: thumbnailURL))

Adding UIRefreshControl

//refreshControl is automatically defined in UITableViewController
var refreshControl: UIRefreshControl?
override func viewDidLoad() {
    super.viewDidLoad()
    
    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: "fetch", forControlEvents: UIControlEvents.ValueChanged)
    tableView.insertSubview(refreshControl!, atIndex: 0)
}

//to stop refresh, call
if let rc = self.refreshControl {
    self.refreshControl!.endRefreshing()
}

Example of fetching messages from Parse

https://gist.github.com/sandofsky/7134b1ff90d235901254

Auto Table Row Height

//Auto table row height
 tableView.estimatedRowHeight = 92.0
 tableView.rowHeight = UITableViewAutomaticDimension

Navigation between storyboards

Navigate to Storyboard ID

var vc = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController
window?.rootViewController = vc

Navigate Segue by Identifier

First, drag a segue in storyboard and give it an identifier, then in the button action (or any action you like), do:

self.performSegueWithIdentifier("loginSegue", sender: self)

Get UIVewController from Navigation Controller

Sometimes, you want to access the UIViewController from a navigation controller

var vc = storyboard?.instantiateViewControllerWithIdentifier("navigationID") as UINavigationController
var v = vc.viewControllers[0] as ViewController // [0] represents the first level UIViewController under NavigationController

Notification in Swift

Listen notification in swift

func tweetSent(notification: NSNotification) {
    let newTweet:Dictionary<String, Tweet> = notification.userInfo as Dictionary<String, Tweet>
}
NSNotificationCenter.defaultCenter().addObserver(self, selector: "tweetSent:", name: "newTweetNotification", object: nil)

Send/Post notification in swift

var userInfo: Dictionary<String, Tweet> = ["tweet": newTweet]
NSNotificationCenter.defaultCenter().postNotificationName("newTweetNotification", object: nil, userInfo: userInfo)

Remove notification observer

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

Get Raw Histogram from CGImage in swift

Credit to http://stackoverflow.com/questions/27237297/how-to-get-meaningful-ciareahistogram-output

//dataImage is a CGImage
var imageData: CFDataRef = CGDataProviderCopyData(CGImageGetDataProvider(dataImage))
var dataInput: UnsafePointer<UInt8> = CFDataGetBytePtr(imageData)
//In swift, I have to do 2 steps. Not sure if there is any better way
var dataInputMutable = UnsafeMutablePointer<Void>(dataInput)
var height: vImagePixelCount = CGImageGetHeight(dataImage)
var width: vImagePixelCount = CGImageGetWidth(dataImage)
//Build a vImage_Buffer for next step
var vImageBuffer = vImage_Buffer(data: dataInputMutable, height: height, width: width, rowBytes: CGImageGetBytesPerRow(dataImage))
//Build the output array.
//To init a multi-dimensional UnsafeMutablePointer array. I have to do 3 steps
//First alloc sub arrays
var r = UnsafeMutablePointer<vImagePixelCount>.alloc(256)
var g = UnsafeMutablePointer<vImagePixelCount>.alloc(256)
var b = UnsafeMutablePointer<vImagePixelCount>.alloc(256)
var a = UnsafeMutablePointer<vImagePixelCount>.alloc(256)
//Then alloc main array
var histogram = UnsafeMutablePointer<UnsafeMutablePointer<vImagePixelCount>>.alloc(4)
//Set the pointer of sub arrays
histogram[0] = r
histogram[1] = g
histogram[2] = b
histogram[3] = a
//Finally, do the histogram calculation
var error:vImage_Error = vImageHistogramCalculation_ARGB8888(&vImageBuffer, histogram, 0);
        
if (error == kvImageNoError) {
    for var j = 0; j < 256; j++ {
        let currentVal = histogram[0][j] + histogram[1][j] + histogram[2][j] //I am making a grey histogram
        if currentVal > 0 {
            println("j=\(j),\(currentVal)")
        }
    }
    //delloc. MUST do this manually to prevent memory leak
    r.dealloc(256)
    g.dealloc(256)
    b.dealloc(256)
    a.dealloc(256)
    histogram.dealloc(4)
} else {
    println("Histogram vImage error: \(error)")
}

UIGraphics Drawing on UIView

Swift: Tutorial Drawing Graphic

See http://www.techotopia.com/index.php/An_iOS_8_Swift_Graphics_Tutorial_using_Core_Graphics_and_Core_Image

Swift: How to make UIGraphics context background transparent

If you want to set a transparent background of the content you are drawing.

// UIGraphics draw transparent background context
@IBOutlet weak var histogramView: HistogramView!
override func viewWillAppear(animated: Bool) {
    histogramView.opaque = false 
    histogramView.backgroundColor = UIColor.clearColor()
}
class HistogramView: UIView {
    override func drawRect(rect: CGRect) {
        // draw content
        let context = UIGraphicsGetCurrentContext()
        CGContextClearRect(context, rect)
    }
}