Xcode6之后蘋果就一直極力倡導(dǎo)使用
storyboard
生宛,特別隨著Xcode6 的Size Class
和IBDesignable
璧榄、IBInspectable
厦取;Xcode7 的Storyboard Reference
推出之后革半,越來越多的開發(fā)者開始使用Storyboard
丛晦。作為一個(gè)Storyboard
的重度使用者,在這里對(duì)使用Storyboard
的一些特性和技巧做一些整理涩馆。
Storyboard Reference
作為xib和storyboard的重度使用者(特別是Xcode6以后)行施,以前storyboard一直被大家吐槽,特別是多人開發(fā)
Merge
的時(shí)候凌净,一大堆warning
悲龟、error
撲面而來,弄得頭都大冰寻。而Xcode7之后出現(xiàn)的Storyboard Reference,讓我為之一喜皿渗。
Storyboard Reference的目的是把一個(gè)個(gè)模塊分離斩芭,既避免了Main.storyboard
的龐大不可把控,又模塊化UI讓分工變得簡(jiǎn)單乐疆,而且可以快速準(zhǔn)確地找到分工的各部分划乖。
使用Storyboard Reference
,最后你看到你的storyboard應(yīng)該是這樣的:
這樣是不是簡(jiǎn)潔明了,可控性好很多挤土,不用再為多人開發(fā)整合而煩惱了~ ~
操作:
只需在
Main.storyboard
中選中要分離的UIViewController
琴庵,然后點(diǎn)擊菜單:Editor->Refactor to Storyboard 創(chuàng)建一個(gè)新的分離出來的storyboard就好了。
Size Class
Xcode6之后出現(xiàn)的Size Class
,下面顯示了iOS設(shè)備及其對(duì)應(yīng)的Size Class:
更直觀的iOS設(shè)備對(duì)應(yīng)的Size Class:
至于size class在各設(shè)備上的相對(duì)應(yīng)的使用就不贅述了仰美,接下來介紹size class
在Attributes Inspector
上的使用:
![](http://7xrgiu.com1.z0.glb.clouddn.com/pic_Size_Class.gif)
Attributes Inspector
中左邊帶+
的都可以使用size class
.
IBDesignable&IBInspectable
IBDesignable
&IBInspectable
的介紹在nshipster中很早之前就有了迷殿,這里也只是我之前使用過的一些整理。
比如咖杂,在Storyboard中給按鈕加圓角庆寺、邊框什么的,User Defined Runtime Attributes
可能是這個(gè)樣子的:
上圖是用戶自定義的運(yùn)行時(shí)屬性的使用诉字,而IBInspectable
屬性提供了一種新的方式懦尝。
創(chuàng)建一個(gè)自定義的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)擊動(dòng)畫
陵霉,只要繼承自這個(gè)自定義按鈕都會(huì)有點(diǎn)擊動(dòng)畫,其效果是這樣的:
User Defined Runtime Attributes
上面圖中最后兩個(gè)是自定義關(guān)聯(lián)的運(yùn)行時(shí)屬性伍绳,
比如layer.colorFromUIColor
,只需新建一個(gè)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
這個(gè)屬性了。
而自定義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)行時(shí)屬性
:
控制好animationType
和delay
就得到了上面的效果止毕,自己不需要寫一句代碼模蜡!有沒有很nice! 反正我最開始用的時(shí)候興奮極了 ~ ~
UIStackView
iOS9之后出來的
UIStackView
比較特別,對(duì)于自動(dòng)布局這塊非常方便扁凛,它可以快速地在垂直或水平排布多個(gè)subview忍疾,最有用的就是它會(huì)自動(dòng)為每個(gè)subview創(chuàng)建和添加Auto Layout constraints。當(dāng)然你可以控制subview的大小和位置谨朝÷倍剩可以通過選項(xiàng)配置subview的大小、排布以及彼此間的間距字币。具體細(xì)節(jié)見iOS 9: UIStackView入門,以下是我自己實(shí)戰(zhàn)操作则披。
![UIStackView](http://7xrgiu.com1.z0.glb.clouddn.com/pic_UIStackView.gif)
至于兼容iOS9之前版本,推薦使用FDStackView洗出,兼容UIStackView iOS9之前版本士复,同樣的,也可以使用storyboard
翩活,非常好阱洪!
FDStackView Part1、FDStackView Part2菠镇、FDStackView Part3這三篇文章是作者分析FDStackView
的設(shè)計(jì)實(shí)現(xiàn)過程冗荸,有興趣可以看一下。
提高Interface Builder高效工作的8個(gè)技巧
- 使view的Size與view中的Content相適應(yīng)
- 按住option鍵—觀察所選中view與另外view邊緣之間的距離
- Editor -> Embed In View, Unembed:
- 在不影響subview的位置時(shí)給view自由的添加padding
- 對(duì)不在最前端的view進(jìn)行移動(dòng)
- IBOutletCollection排序
- 使用自定義屬性
- MoarFonts——字體定制:所見即所得
具體細(xì)節(jié)查看原文:提高Interface Builder高效工作的8個(gè)技巧
總結(jié):
我現(xiàn)在一直在使用storyboard
利耍,至今感覺良好蚌本!特別有了這些技巧和特性之后,效率那是杠杠的.隘梨。這里把以前用過的寫在這里分享?出來程癌,也方便我自己總結(jié)和回顧。
這篇文章主要內(nèi)容:
- Storyboard Reference:Storyboard分離
- Size Class:多設(shè)備自動(dòng)布局
- IBDesignable&IBInspectable:配置自定義控件
- User Defined Runtime Attributes:用戶自定義運(yùn)行時(shí)屬性
- UIStackView:方便垂直或水平排布多個(gè)subview
- 提高Interface Builder高效工作的8個(gè)技巧:Interface Builder的操作技巧