受 Google Material Design 的 Paper 主题启发的扁平按钮。
BFPaperButton 是 UIButton 的子类,其行为类似于 Google 的 Material Design Labs 中的新纸按钮。所有动画都是异步的,在子层上执行。BFPaperButtons 直接使用令人愉悦的默认行为进行工作,但它们可以轻松进行自定义!通过公共属性可以轻松自定义圆角半径、点击圆圈颜色、背景渐变颜色和点击圆圈直径。
BFPaperButtons 有两种类型:平的或提升的。平的 BFPaperButtons 没有阴影,在所有动画过程中都将保持扁平。平按钮可以是透明的,在这种情况下,背景在被点击时也会稍微淡入。提升的 BFPaperButtons 有一个随着点击一起动画的阴影,使其有随着触摸提升的感觉。提升的 BFPaperButtons 与清晰 backgrounds 颜色不好看,因为它将暴露其阴影层。
默认情况下,BFPaperButtons 使用 "智能颜色",这会将点击圆圈和背景渐变颜色与 titleLabel
的颜色相匹配。您可以通过将属性设置为 YES
来关闭智能颜色。如果您禁用智能颜色,点击圆圈和背景颜色渐变将默认使用灰色。您可以通过:.tapCircleColor
和 .backgroundFadeColor
来设置自己的颜色。注意,设置这些将禁用智能颜色。
注意 当在 Storyboard 中将按钮类型设置为自定义时,需要将其设置为 Custom 以防止标题在 UIControlStateHighlighted 状态下渐出。
UIColor *shadowColor
提升按钮的阴影颜色。建议使用 alpha 值为
1
,因为 shadowOpacity 会覆盖此颜色的 alpha。
CGFloat loweredShadowOpacity
A CGFLoat 代表提升按钮在降低(空闲)时的阴影不透明度。默认值为
0.5f
。
CGFloat loweredShadowRadius
A CGFLoat 代表提升按钮在降低(空闲)时的阴影半径。默认值为
1.5f
。
CGSize loweredShadowOffset
A CGSize 代表提升按钮在降低(空闲)时的阴影偏移量。默认值为
(0, 1)
。
CGFloat liftedShadowOpacity
A CGFloat表示当提升(触摸时)RAISED按钮的阴影透明度。默认值为
0.5f
。
CGFloat liftedShadowRadius
A CGFloat表示当提升(触摸时)RAISED按钮阴影的半径。默认值为
4.5f
。
CGSize liftedShadowOffset
A CGSize表示当提升(触摸时)RAISED按钮阴影的偏移。默认值为
(2, 4)
。
CGFloat touchDownAnimationDuration
A CGFloat表示在触摸时发生的动画的持续时长。默认值为
0.25f
秒。(为钢铁人加油!)
CGFloat touchUpAnimationDuration
A CGFloat表示在触摸后发生的动画的持续时长。默认值为
touchDownAnimationDuration
的2倍秒。
CGFloat tapCircleDiameterStartValue
A CGFloat表示当触摸圆刚出现时的直径,在它生长之前。默认值为
5.f
。
CGFloat tapCircleDiameter
代表触摸圆直径的CGFloat值。默认将是用
MAX(self.frame.width, self.frame.height)
计算的结果。tapCircleDiameterFull
将计算出一个总是填充整个视图的圆。任何小于或等于tapCircleDiameterFull
的值将使用默认值。还可以使用以下常量:tapCircleDiameterLarge
、tapCircleDiameterMedium
和tapCircleDiameterSmall
。
CGFloat tapCircleBurstAmount
表示在爆炸触摸圆时增加了直径的CGFloat值。默认值为
100.f
。
CGFloat cornerRadius
将传播到子层的圆角。默认值为
0
。
UIColor *tapCircleColor
用于出现在触摸位置的颜色。注意:设置此值将关闭触摸圆的“智能颜色”功能。建议使用小于
1
的透明度值。
UIColor *backgroundFadeColor
用于使背景淡入透明的颜色。注意:设置此值将关闭背景淡入的“智能颜色”功能。建议使用小于
1
的透明度值。
BOOL rippleFromTapLocation
设置为
YES
以使触摸圆从触摸点产生涟漪。如果设置为NO
,则触摸圆始终从视图的中心产生涟漪。默认值为YES
。
BOOL rippleBeyondBounds
设置为
YES
以使触摸圆超出视图边界产生涟漪。如果设置为NO
,则触摸圆将被裁剪到视图的边界内。默认值为NO
。
BOOL isRaised
设置为
YES
以将平面视图更改为提升,或设置为NO
以将提升视图更改为平面。如果您使用了提供的自定义初始化器,您可能不需要修改此参数。如果您通过故事板或IB实例化并通过提升到平面更改,此参数就是为您设计的!默认值为YES
。
BOOL usesSmartColor
设置为YES以使用智能颜色,或设置为NO以使用自定义颜色方案。虽然智能颜色是默认值(usesSmartColor = YES),但自定义也非常酷。
具有阴影,因此透明的背景看起来很傻。它只有触摸圆颜色。没有背景淡入。
无阴影,因此清晰的背景看起来很好。如果背景是清晰的,它还将具有背景渐变颜色,以帮助可视化按钮及其框架。
将使用titleLabel的字体颜色来选择触摸圆圈颜色,如果背景是清晰的,也将选择一个较浅的背景渐变颜色。
将使用半透明的灰色触摸圆圈,如果背景是清晰的,还将使用较浅的半透明灰色背景渐变颜色。
将BFPaperButton头文件和实现文件添加到您的项目中。(.h & .m)
BFPaperButton *flatPaperButton = [[BFPaperButton alloc] initWithFrame:rect raised:NO];
BFPaperButton *raisedPaperButton = [[BFPaperButton alloc] initWithFrame:rect raised:YES];
(直接从示例项目中提取。)
BFPaperButton *bfFlatSmart = [[BFPaperButton alloc] initWithFrame:CGRectMake(20, 20, 280, 43) raised:NO];
[bfFlatSmart setTitle:@"BFPaperButton Flat: Smart Color" forState:UIControlStateNormal];
bfFlatSmart.backgroundColor = [UIColor paperColorGray600]; // You can find this from my other library, BFPaperColors :)
[bfFlatSmart setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[bfFlatSmart setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[bfFlatSmart addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:bfFlatSmart];
(直接从示例项目中提取。)
BFPaperButton *circle2 = [[BFPaperButton alloc] initWithFrame:CGRectMake(116, 468, 86, 86) raised:YES];
[circle2 setTitle:@"Custom" forState:UIControlStateNormal];
[circle2 setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[circle2 setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[circle2 addTarget:self action:@selector(buttonWasPressed:) forControlEvents:UIControlEventTouchUpInside];
circle2.backgroundColor = [UIColor colorWithRed:0.3 green:0 blue:1 alpha:1];
circle2.tapCircleColor = [UIColor colorWithRed:1 green:0 blue:1 alpha:0.6]; // Setting this color overrides "Smart Color".
circle2.cornerRadius = circle2.frame.size.width / 2;
circle2.rippleFromTapLocation = NO;
circle2.rippleBeyondBounds = YES;
circle2.tapCircleDiameter = MAX(circle2.frame.size.width, circle2.frame.size.height) * 1.3;
[self.view addSubview:circle2];
BFPaperButton 使用MIT许可证
请参阅包含的LICENSE文件。