|
|
(23 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | =Swift Code snippts= | + | =Swift Code Snippts= |
| Back To [[IOS_Swift]] | | Back To [[IOS_Swift]] |
− | ==Making Network Request== | + | ==[[Swift: Use NSUserDefaults to Store Persistence Data]]== |
− | <pre class="brush:swift">
| + | |
− | 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)")
| + | |
− | }
| + | |
− | </pre>
| + | |
| | | |
− | ==Use AFNetworking setImageWithURL== | + | ==[[Swift: Making Network Request Using NSURLConnection]]== |
− | 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. <br>
| + | |
− | In an Objective-C bridging file:
| + | |
− | <pre class="brush:swift">
| + | |
− | #import <AFNetworking/UIImageView+AFNetworking.h>
| + | |
− | </pre>
| + | |
− | In the swift view file, to set a imageView using URL:
| + | |
− | <pre class="brush:swift">
| + | |
− | setImageWithURL(NSURL(string: thumbnailURL))
| + | |
− | </pre>
| + | |
| | | |
− | ==Adding UIRefreshControl== | + | ==[[Swift:Use AFNetworking setImageWithURL]]== |
− | <pre class="brush:swift">
| + | |
− | //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
| + | ==[[Swift:Using UIRefreshControl]]== |
− | if let rc = self.refreshControl {
| + | |
− | self.refreshControl!.endRefreshing()
| + | |
− | }
| + | |
− | </pre>
| + | |
| | | |
− | ==Example of fetching messages from Parse== | + | ==[[Swift:Using UIGestureRecognizer]]== |
| + | |
| + | ==Swift:Example of fetching messages from Parse== |
| https://gist.github.com/sandofsky/7134b1ff90d235901254 | | https://gist.github.com/sandofsky/7134b1ff90d235901254 |
− | ==Auto Table Row Height==
| |
− | <pre class="brush:swift">
| |
− | //Auto table row height
| |
− | tableView.estimatedRowHeight = 92.0
| |
− | tableView.rowHeight = UITableViewAutomaticDimension
| |
− | </pre>
| |
− | ==Navigation between storyboards==
| |
− | ===Navigate to Storyboard ID===
| |
− | <pre class="brush:swift">
| |
− | var vc = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController
| |
− | window?.rootViewController = vc
| |
− | </pre>
| |
− | ===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:
| |
− | <pre class="brush:swift">
| |
− | self.performSegueWithIdentifier("loginSegue", sender: self)
| |
− | </pre>
| |
− | ===Get UIVewController from Navigation Controller===
| |
− | Sometimes, you want to access the UIViewController from a navigation controller
| |
− | <pre class="brush:swift">
| |
− | var vc = storyboard?.instantiateViewControllerWithIdentifier("navigationID") as UINavigationController
| |
− | var v = vc.viewControllers[0] as ViewController // [0] represents the first level UIViewController under NavigationController
| |
− | </pre>
| |
− | ==Notification in Swift==
| |
− | Listen notification in swift
| |
− | <pre class="brush: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)
| |
− | </pre>
| |
− | Send/Post notification in swift
| |
− | <pre class="brush:swift">
| |
− | var userInfo: Dictionary<String, Tweet> = ["tweet": newTweet]
| |
− | NSNotificationCenter.defaultCenter().postNotificationName("newTweetNotification", object: nil, userInfo: userInfo)
| |
− | </pre>
| |
− | Remove notification observer
| |
− | <pre class="brush:swift">
| |
− | deinit {
| |
− | NSNotificationCenter.defaultCenter().removeObserver(self)
| |
− | }
| |
− | </pre>
| |
− | ==Get Raw Histogram from CGImage in swift==
| |
− | Credit to http://stackoverflow.com/questions/27237297/how-to-get-meaningful-ciareahistogram-output
| |
| | | |
− | <pre class="brush:swift">
| + | ==[[Swift:Auto Table Row Height]]== |
− | //dataImage is a CGImage
| + | |
− | var imageData: CFDataRef = CGDataProviderCopyData(CGImageGetDataProvider(dataImage))
| + | ==[[Swift:Navigation between storyboards]]== |
− | var dataInput: UnsafePointer<UInt8> = CFDataGetBytePtr(imageData)
| + | |
− | //In swift, I have to do 2 steps. Not sure if there is any better way
| + | ==[[Swift:Notification Observer Using NSNotificationCenter]]== |
− | var dataInputMutable = UnsafeMutablePointer<Void>(dataInput)
| + | |
− | var height: vImagePixelCount = CGImageGetHeight(dataImage)
| + | ==[[Swift:Get Raw Histogram from CGImage]]== |
− | var width: vImagePixelCount = CGImageGetWidth(dataImage)
| + | |
− | //Build a vImage_Buffer for next step
| + | ==[[Swift:UIGraphics Drawing on UIView]]== |
− | var vImageBuffer = vImage_Buffer(data: dataInputMutable, height: height, width: width, rowBytes: CGImageGetBytesPerRow(dataImage))
| + | |
− | //Build the output array.
| + | ==[[Swift:UIGraphics Scale Down CGImage]]== |
− | //To init a multi-dimensional UnsafeMutablePointer array. I have to do 3 steps
| + | |
− | //First alloc sub arrays
| + | ==[[Swift: Convert between CGImage, CIImage and UIImage]]== |
− | 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)")
| + | |
− | }
| + | |
− | </pre>
| + | |
− | ==UIGraphics Drawing on UIView== | + | |
− | 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? | + | ==[[Swift:Detect Volumn Button Press]]== |
| | | |
− | If you want to set a transparent background of the content you are drawing.
| + | ==[[Swift:NSTimer scheduledTimerWithTimeInterval]]== |
− | <pre class="brush:swift">
| + | |
− | // 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)
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |