Xcode6之后蘋果就一直極力倡導(dǎo)使用
storyboard
,特別隨著Xcode6 的Size Class
和IBDesignable
、IBInspectable
;Xcode7 的Storyboard Reference
推出之后,越來越多的開發(fā)者開始使用Storyboard
。作為一個Storyboard
的重度使用者,在這里對使用Storyboard
的一些特性和技巧做一些整理。
Storyboard Reference
作為xib和storyboard的重度使用者(特別是Xcode6以后),以前storyboard一直被大家吐槽,特別是多人開發(fā)
Merge
的時候,一大堆warning
、error
撲面而來,弄得頭都大。而Xcode7之后出現(xiàn)的Storyboard Reference,讓我為之一喜。
Storyboard Reference的目的是把一個個模塊分離,既避免了Main.storyboard
的龐大不可把控,又模塊化UI讓分工變得簡單,而且可以快速準(zhǔn)確地找到分工的各部分。
使用Storyboard Reference
,最后你看到你的storyboard應(yīng)該是這樣的:
這樣是不是簡潔明了,可控性好很多,不用再為多人開發(fā)整合而煩惱了~ ~
操作:
只需在
Main.storyboard
中選中要分離的UIViewController
,然后點(diǎn)擊菜單:Editor->Refactor to Storyboard 創(chuàng)建一個新的分離出來的storyboard就好了。
Size Class
Xcode6之后出現(xiàn)的Size Class
,下面顯示了iOS設(shè)備及其對應(yīng)的Size Class:
更直觀的iOS設(shè)備對應(yīng)的Size Class:
至于size class在各設(shè)備上的相對應(yīng)的使用就不贅述了,接下來介紹size class
在Attributes Inspector
上的使用:

Attributes Inspector
中左邊帶+
的都可以使用size class
.
IBDesignable&IBInspectable
IBDesignable
&IBInspectable
的介紹在nshipster中很早之前就有了,這里也只是我之前使用過的一些整理。
比如,在Storyboard中給按鈕加圓角、邊框什么的,User Defined Runtime Attributes
可能是這個樣子的:
上圖是用戶自定義的運(yùn)行時屬性的使用,而IBInspectable
屬性提供了一種新的方式。
創(chuàng)建一個自定義的UIButton
:
.h文件
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface MyDrawButton : UIButton
@property (nonatomic) IBInspectable UIColor *fillColor; //填充顏色
@property (nonatomic) IBInspectable NSInteger lineWidth; //線的寬度
@property (nonatomic) IBInspectable NSInteger cornerRadius; //圓角弧度
@property (nonatomic) IBInspectable NSInteger borderWidth; //邊框?qū)挾?
@end
.m文件
#import "MyDrawButton.h"
#import <pop/POP.h>
@implementation MyDrawButton
- (void)drawRect:(CGRect)rect {
CGContextRef context=UIGraphicsGetCurrentContext();
CGRect myFrame=self.bounds;
CGContextSetLineWidth(context, _lineWidth);
CGRectInset(myFrame, 5, 5);
[_fillColor set];
UIRectFrame(myFrame);
self.layer.cornerRadius=_cornerRadius;
self.layer.borderWidth=_borderWidth;
self.layer.borderColor=_fillColor.CGColor;
[self addTarget:self action:@selector(scaleToSmall)
forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter];
[self addTarget:self action:@selector(scaleAnimation)
forControlEvents:UIControlEventTouchUpInside];
[self addTarget:self action:@selector(scaleToDefault)
forControlEvents:UIControlEventTouchDragExit];
}
- (void)scaleToSmall
{
POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0.95f, 0.95f)];
[self.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleSmallAnimation"];
}
- (void)scaleAnimation
{
POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
scaleAnimation.velocity = [NSValue valueWithCGSize:CGSizeMake(2.f, 2.f)];
scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)];
scaleAnimation.springBounciness = 25.0f;
[self.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleSpringAnimation"];
}
- (void)scaleToDefault
{
POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)];
[self.layer pop_addAnimation:scaleAnimation forKey:@"layerScaleDefaultAnimation"];
}
@end
storyboard中的UIButton
只需繼承自它,然后就可以在Attributes Inspector
中看到這些屬性:
給相應(yīng)的屬性設(shè)值就有效果了。而上面給自定義按鈕添加了點(diǎn)擊動畫
,只要繼承自這個自定義按鈕都會有點(diǎn)擊動畫,其效果是這樣的:
User Defined Runtime Attributes
上面圖中最后兩個是自定義關(guān)聯(lián)的運(yùn)行時屬性,
比如layer.colorFromUIColor
,只需新建一個CALayer
的Category
:
.h文件
@interface CALayer (Addition)
@property(nonatomic,strong) UIColor *colorFromUIColor;
-(void)setColorFromUIColor:(UIColor *)color;
@end
.m文件
#import "CALayer+Addition.h"
#import <objc/runtime.h>
@implementation CALayer (Addition)
@dynamic colorFromUIColor;
-(UIColor *)colorFromUIColor
{
return objc_getAssociatedObject(self, @selector(colorFromUIColor));
}
-(void)setColorFromUIColor:(UIColor *)color
{
objc_setAssociatedObject(self, @selector(colorFromUIColor), color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self setColorFromUI:self.colorFromUIColor];
}
-(void)setColorFromUI:(UIColor *)color
{
self.borderColor=color.CGColor;
}
@end
這樣設(shè)置就ok了,然后在User Defined Runtime Attributes
中就可以設(shè)置colorFromUIColor
這個屬性了。
而自定義runtime屬性bindingAnimationType
來自FastAnimationWithPOP,配置相關(guān)屬性運(yùn)行可以直接得到如下效果:
配置:
導(dǎo)入pop
、FastAnimationWithPOP
:
pod 'pop', '~> 1.0.9'
pod 'FastAnimationWithPOP', '~> 0.0.2'
然后在Identity Inspector
中配置控件的用戶自定義運(yùn)行時屬性
:
控制好animationType
和delay
就得到了上面的效果,自己不需要寫一句代碼!有沒有很nice! 反正我最開始用的時候興奮極了 ~ ~
UIStackView
iOS9之后出來的
UIStackView
比較特別,對于自動布局這塊非常方便,它可以快速地在垂直或水平排布多個subview,最有用的就是它會自動為每個subview創(chuàng)建和添加Auto Layout constraints。當(dāng)然你可以控制subview的大小和位置。可以通過選項(xiàng)配置subview的大小、排布以及彼此間的間距。具體細(xì)節(jié)見iOS 9: UIStackView入門,以下是我自己實(shí)戰(zhàn)操作。

至于兼容iOS9之前版本,推薦使用FDStackView,兼容UIStackView iOS9之前版本,同樣的,也可以使用storyboard
,非常好!
FDStackView Part1、FDStackView Part2、FDStackView Part3這三篇文章是作者分析FDStackView
的設(shè)計(jì)實(shí)現(xiàn)過程,有興趣可以看一下。
提高Interface Builder高效工作的8個技巧
- 使view的Size與view中的Content相適應(yīng)
- 按住option鍵—觀察所選中view與另外view邊緣之間的距離
- Editor -> Embed In View, Unembed:
- 在不影響subview的位置時給view自由的添加padding
- 對不在最前端的view進(jìn)行移動
- IBOutletCollection排序
- 使用自定義屬性
- MoarFonts——字體定制:所見即所得
具體細(xì)節(jié)查看原文:提高Interface Builder高效工作的8個技巧
總結(jié):
我現(xiàn)在一直在使用storyboard
,至今感覺良好!特別有了這些技巧和特性之后,效率那是杠杠的.。這里把以前用過的寫在這里分享?出來,也方便我自己總結(jié)和回顧。
這篇文章主要內(nèi)容:
- Storyboard Reference:Storyboard分離
- Size Class:多設(shè)備自動布局
- IBDesignable&IBInspectable:配置自定義控件
- User Defined Runtime Attributes:用戶自定義運(yùn)行時屬性
- UIStackView:方便垂直或水平排布多個subview
- 提高Interface Builder高效工作的8個技巧:Interface Builder的操作技巧