Swift code snippets
Contents
- 1 Swift Code snippts
- 1.1 Making Network Request
- 1.2 Use AFNetworking setImageWithURL
- 1.3 Adding UIRefreshControl
- 1.4 Example of fetching messages from Parse
- 1.5 Auto Table Row Height
- 1.6 Navigation between storyboards
- 1.7 Notification in Swift
- 1.8 Get Raw Histogram from CGImage in swift
- 1.9 UIGraphics Drawing on UIView
- 1.10 Swift: Scale down CGImage
- 1.11 Swift: Convert CIImage to CGImage
- 1.12 Swift Detect Volumn Button Press
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
var vc = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController window?.rootViewController = vc
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)
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
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) } }
Swift: Scale down CGImage
func scaleDownCGImage(image: CGImage, scale: Float) -> CGImage!{ var scaleDiv = UInt(1.0 / scale) let width = CGImageGetWidth(image) / scaleDiv let height = CGImageGetHeight(image) / scaleDiv let bitsPerComponent = CGImageGetBitsPerComponent(image) let bytesPerRow = CGImageGetBytesPerRow(image) let colorSpace = CGImageGetColorSpace(image) let bitmapInfo = CGImageGetBitmapInfo(image) let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo) CGContextSetInterpolationQuality(context, kCGInterpolationMedium) let imgSize = CGSize(width: Int(width), height: Int(height)) CGContextDrawImage(context, CGRect(origin: CGPointZero, size: imgSize), image) return CGBitmapContextCreateImage(context) }
Swift: Convert CIImage to CGImage
func convertCIImageToCGImage(inputImage: CIImage) -> CGImage! { let context = CIContext(options: nil) if context != nil { return context.createCGImage(inputImage, fromRect: inputImage.extent()) } return nil }
Swift Detect Volumn Button Press
Credit to http://stackoverflow.com/questions/28471481/swift-detect-volume-button-press
Detect volume button press, also hide volume HUD
import MediaPlayer //Only for hidding Volume view func listenVolumeButton(){ let audioSession = AVAudioSession.sharedInstance() audioSession.setActive(true, error: nil) audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.New, context: nil) //If you want to hide Volume HUD view var volumeView: MPVolumeView = MPVolumeView(frame: CGRectZero) view.addSubview(volumeView) } override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if keyPath == "outputVolume"{ print("got in here") } }