Need job

Looking for job in Europe. Please contact thru LinkedIn profile.

Wednesday, November 29, 2017

Text kern/letter spacing in Xcode Interface builder

Sometimes designers uses different kern, not default.
How to change it with minimal time?
Add inspectable text attribute.

Here is ready-to-use code for UIButton.
Very easy transformable to UILabel.

extension UIButton {

    @IBInspectable
    var letterSpace: CGFloat {
        set {
            let attributedString: NSMutableAttributedString!
            if let currentAttrString = attributedTitle(for: .normal) {
                attributedString = NSMutableAttributedString(attributedString: currentAttrString)
            }
            else {
                attributedString = NSMutableAttributedString(string: self.titleLabel?.text ?? "")
                setTitle(.none, for: .normal)
            }

            attributedString.addAttribute(NSKernAttributeName,
                                           value: newValue,
                                           range: NSRange(location: 0, length: attributedString.length))

            setAttributedTitle(attributedString, for: .normal)
        }

        get {
            if let currentLetterSpace = attributedTitle(for: .normal)?.attribute(NSKernAttributeName, at: 0, effectiveRange: .none) as? CGFloat {
                return currentLetterSpace
            }
            else {
                return 0
            }
        }
    }
}

Thursday, February 9, 2017

Swift weak delegate

When you need to declare weak delegate property you may caught " 'weak' may only be applied to class and class-bound protocol types, not 'SwipePickerDelegate'".


Apple mentioned this in docs here:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID281

So, all you need is add "class" keyword to protocol.


Tuesday, January 31, 2017

Couldn't create mapping policy for class named () - Core Data migration error

Its easy to fix it.
One of possible reasons is Policy class name w/o namespace.
On the image below a PRODUCT_MODULE_NAME mentioned with red.


If you don't now the name, here is the trick to find out.