IBDesignable / IBInspectable で UIプロトタイピンガブル
-
Upload
masaki-oshikawa -
Category
Technology
-
view
279 -
download
2
Transcript of IBDesignable / IBInspectable で UIプロトタイピンガブル
IBDesignable / IBInspectable
使ってますか?
XCode 6 から使える
Interface Builder で修正できないものを変更可能に
変更内容を Interface Builder で確認できる
使い方
import UIKit
@IBDesignable class DesignableView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
}
}
}
Extension でも実装できます
※ (conputed propertyで)
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
他にもこんな値が割り振れます
* Bool
* Int
* CGFloat
* Double
* String
* CGPoint
* CGSize
* CGRect
* UIColor
* UIImage
UIImageView.SVGNamed(named: String)
UIImage+SVG等を利用してSVGのファイル名から画像表示。
xmlから作成もできるかも
@IBDesignable class SVGImageView: UIImageView {
@IBInspectable var SVGNamed: NSString?
@IBInspectable var SVGImageSize: CGSize?
@IBInspectable var SVGColor: UIColor?
override func awakeFromNib() {
super.awakeFromNib()
let size = SVGImageSize ?? frame.size
image = UIImage(SVGNamed: SVGNamed,
targetSize: size,
fillColor: SVGColor)
}
}
UIImageView.iconFontNamed
FontAwesomeKitを利用してFontIconの名前で画像表示。
@IBDesignable class IconFontImageButton: UIButton {
@IBInspectable var iconFontNamed: String? {
didSet {
self.iconFont = IconFont(rawValue: iconFontNamed!)!
}
}
var iconFont: IconFont = .None {
didSet {
updateImage()
}
}
@IBInspectable var iconPoint: CGFloat = CGFloat.NaN {
didSet {
updateImage()
}
}
private func updateImage() {
let point = iconPoint.isNaN ? min(frame.size.width, frame.size.height) : iconPoint
let img = iconFont.image(point: point, outSize: frame.size)
enumが使えないのが残念。一個一個マッピングして使ってま
す
enum IconFont: String {
case None = "none"
case ArrowBack = "ArrowBack"
func image(point point: CGFloat, outSize: CGSize) -> UIImage? {
var icon: FAKIonIcons? = nil
switch self {
case .None:
break
case .ArrowBack:
icon = FAKIonIcons.iosArrowBackIconWithSize(point)
}
return icon?.imageWithSize(outSize)
}
}
UIButton.highlightedBackgroundColor
@IBDesignable class DesignableButton: UIButton {
@IBInspectable var highlightedBackgroundColor: UIColor?
private var defaultBackgroundColor: UIColor?
override var highlighted: Bool {
didSet {
if highlighted {
backgroundColor = highlightedBackgroundColor
} else {
backgroundColor = defaultBackgroundColor
}
}
}
UIImageView.imageURLString
@IBDesignable class DesignableImageView: UIImageView {
@IBInspectable var imageURLString: String = "" {
didSet {
if let URL = NSURL(string: imageURLString) {
image = UIImage(data: NSData(contentsOfURL: URL)!)
}
}
}
}
※ レンダリングの処理が200msを超えるとtimeoutになります
あくまでも仮で表示したい場合に。
UIImageView.imageOrientation
@IBInspectable var imageOrientation: Int = 0 {
didSet {
let orientation = UIImageOrientation(rawValue: imageOrientation)!
image = UIImage(CGImage: image?.CGImage, scale: 0, orientation: orientation)
}
}
他にも
* UIButton.imageSize: insetで引き算するより使いやすい
* UIImageView.placeHolderImage: SDWebImage等の非同期読み込み時の画像
* gradation, gradationDirection: UIColor 2つ と グラデーションする方向
* cornerRadius: CGFloat
* borderCurcle: Bool
* backgroundBlur: Bool (未確認)
* borderColor
* shadowColor
* などなど
extension Roundable where Self : UIView {
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
@IBDesignable class RoundableView: UIView, Roundable {
override func awakeFromNib() {
super.awakeFromNib()
}
}
@IBDesignable class RoundableImageView: UIImageView, Roundable {
override func awakeFromNib() {
super.awakeFromNib()
}
}
理由
IBInspectableはinstance propertyにのみ設定可能
Protocol Extension にはインスタンス変数は作れない
extension ならcomputed propertyで可能です
おわり
Protocol Extensionについては Tomohiro Kumagai @es_kumagai
さんの資料が参考になります
Swift 2.0 大域関数の行方から #swift2symposium
プロトコル拡張の話? #WWDC21cafe
http://www.slideshare.net/tomohirokumagai54/swift-20-
49927701
http://www.slideshare.net/tomohirokumagai54/wwdc21cafe