Thursday 10 November 2016

Change in privacy setting in iOS10

There is one major change in iOS 10 when using some framework. With iOS 10 , now we have to ask for accessing user's private data like camera, photos, contacts ,microphone etc . Now with release of iOS 10, we must declare the usage of any private data in info.plist, otherwise our application will crash when accessing these data .

The list of framework that counts as sensitive data is:







We must declare the usage description of these in info.plist as:




















These are the key for which we have to provide the usage description in info.plist .

References
useyourloaf.com
https://developer.apple.com/library/prerelease/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

Friday 4 November 2016

Custom UI Elements with IBDesignable

In Xcode 6 two new interface builder declaration attributes were added: IBDesignable and IBInspectable.

IBDesignable updates the view in real time. We prefix out class with @IBDesignable keyword to inform interface builder that the class' instance will try to design  themselves when added to the storyboard:

@IBDesignable class MyCustomView: UIView{

}

Then we prefix any properties of the class with @IBInspectable to ensure that interface builder can read and write the value of these properties directly in the inspector view.

With these two new keyword we can create custom UI controls as per our need and use them directly in interface builder and can change their properties in inspector view as we do with other built in UI controls . To create a custom UI elements we have to perform following steps:

1) Create a View .Xib file and design the required view .

2) Then setup auto layout constraints.

3) Create a .swift file to write code .

4) Set .xib file's  File's Owner custom class to  the class we created in last step .

5) In .swift file implement initializers: init(coder:) and init(frame:) .

6) Load the UIView from  the .xib file using NSBundle and  UINIb classes .

7) Add the  view as a subview and  property  for the class .

8) Add auto resizing masks for the view to match the size of the Custom View itself .

9) Make the  view's frame to have the same size as in design time  by assigning CustomView's bounds .

Here is the sample class code :

import UIKit

@IBDesignable class MyCustomView: UIView {

let nibName = "MyCustomView"
var view: UIView!

@IBInspectable var date: String = "3/19/1990" {
            
             didSet{
                          
                       }
}


override init(frame: CGRect) {
     super.init(frame)
    setupXib()
}

required init?(coder aDecoder: NSCoder){
     super.init(coder: aDecoder)
     setupXib()
}

func setupXib() -> Void {

view  =  loadFromNib()
view.frame =  bounds
view.autoresizingMask =  [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
addSubview(view)

}

func loadFromNib() -> UIView {

 let bundle =  NSBundle(forClass: self.dynamicType)

 let nib = UINib(nibName: nibName, bundle: bundle)

 let view =  nib.instantiateWithOwner(self, options:nil)[0] as! UIView

 return view
}

}


Resources:
http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6
https://www.weheartswift.com/make-awesome-ui-components-ios-8-using-swift-xcode-6/