RDMBorderedButton
RDMBorderedButton

https://github.com/reesemclean/RDMBorderedButton
效果:

源码:
RDMBorderedButton.h + RDMBorderedButton.m
//
// RDMBorderedButton.h
// RDMBorderedButton
//
// Created by Reese McLean on 6/12/14.
// Copyright (c) 2014 Reese McLean. All rights reserved.
// #import <UIKit/UIKit.h> @interface RDMBorderedButton : UIButton ///Adjusting corner radius manually turns off automatic corner radius updating.
@property (nonatomic, assign) CGFloat cornerRadius; ///Determines whether the buttons corner radius is adjusting based on frame changes. Default = YES.
@property (nonatomic, assign) BOOL adjustsCornerRadiusBasedOnFrame; ///Approximate ratio of corner radius to smallest side of button frame. Default = 1.0/6.0.
@property (nonatomic, assign) CGFloat cornerRadiusRatioToSmallestSide; @end
//
// RDMBorderedButton.m
// RDMBorderedButton
//
// Created by Reese McLean on 6/12/14.
// Copyright (c) 2014 Reese McLean. All rights reserved.
// #import "RDMBorderedButton.h" @implementation RDMBorderedButton -(id) init {
return [self initWithFrame:CGRectZero];
} - (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self commonSetup];
}
return self;
} -(id) initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) { NSAssert(self.buttonType == UIButtonTypeCustom, @"RDMBorderedButton's created in interface builder must be set to type custom."); [self commonSetup];
}
return self;
} -(void) commonSetup { [self setTitleColor:self.tintColor forState:UIControlStateNormal];
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
[self setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; _adjustsCornerRadiusBasedOnFrame = YES;
_cornerRadiusRatioToSmallestSide = 1.0/6.0;
[self adjustCornerRadius]; self.layer.cornerRadius = _cornerRadius;
self.layer.borderWidth = 1.0;
self.layer.borderColor = self.tintColor.CGColor;
} -(void) layoutSubviews {
[super layoutSubviews];
if (self.adjustsCornerRadiusBasedOnFrame) {
[self adjustCornerRadius];
}
} -(void) tintColorDidChange {
[super tintColorDidChange];
[self setTitleColor:self.tintColor forState:UIControlStateNormal];
[self updateBorderAndFill];
} -(void) adjustCornerRadius {
_cornerRadius = roundf(MIN(CGRectGetHeight(self.frame), CGRectGetWidth(self.frame)) * self.cornerRadiusRatioToSmallestSide);
self.layer.cornerRadius = _cornerRadius;
} -(void) setTitleColor:(UIColor *)color forState:(UIControlState)state { if ([[self titleColorForState:state] isEqual:color]) {
return;
} [super setTitleColor:color forState:state]; if (state == UIControlStateNormal) {
self.tintColor = color;
} [self updateBorderAndFill];
} -(void) setTintColor:(UIColor *)tintColor { if ([[self tintColor] isEqual:tintColor]) {
return;
} [super setTintColor:tintColor];
[self setTitleColor:self.tintColor forState:UIControlStateNormal];
[self updateBorderAndFill];
} -(void) setCornerRadius:(CGFloat)cornerRadius {
self.adjustsCornerRadiusBasedOnFrame = NO;
_cornerRadius = cornerRadius;
self.layer.cornerRadius = _cornerRadius;
} -(void) setEnabled:(BOOL)enabled { [super setEnabled:enabled];
[self updateBorderAndFill]; } -(void) updateBorderAndFill {
self.layer.borderColor = self.enabled ? self.tintColor.CGColor : [self titleColorForState:UIControlStateDisabled].CGColor;
self.backgroundColor = self.highlighted ? self.tintColor : [UIColor clearColor];
} -(void) setHighlighted:(BOOL)highlighted { if (self.highlighted == highlighted) {
return;
} [super setHighlighted:highlighted]; [UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState
animations:^{
self.backgroundColor = highlighted ? self.tintColor : [UIColor clearColor];
}
completion:nil]; } @end
显示的代码:
//
// RootViewController.m
//
// http://home.cnblogs.com/u/YouXianMing/
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "RDMBorderedButton.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; // 初始化
RDMBorderedButton *button = \
[[RDMBorderedButton alloc] initWithFrame:CGRectMake(, , , )];
button.center = self.view.center; // 设置圆角
button.cornerRadius = .f; // 设置字体
button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Thin"
size:.f]; // 设置标题
[button setTitle:@"YouXianMing"
forState:UIControlStateNormal]; // 设置标题颜色
[button setTitleColor:[UIColor redColor]
forState:UIControlStateNormal]; [self.view addSubview:button];
} @end
附录:
Usage
In code: Use initWithFrame to create a button and add to a subview.
Interface Builder: Add a button as usual. Set the class to RDMBorderedButton — there are some bugs with iOS 7.1 that require you to set the buttom type to Custom in Interface Builder. Also note that you can use the "User Defined Runtime Attributes" in Interface Builder to set the corner radius (key: "cornerRadius"). The example project shows this with the black and yellow buttons.
Corner Radius
By default, RDMBorderedButton will adjusts the corner radius of its border based on its frame. You can turn this off with:
button.adjustsCornerRadiusBasedOnFrame = NO; //Default is YES
You can also change the ratio of the corner radius of this automatic adjustment:
button.cornerRadiusRatioToSmallestSide = 1.0/4.0; //Default is 1.0/6.0
Note that changes to Corner Radius will not be animated. If you would like a corner radius change to be animated you will need to animate the key path using CoreAnimation. See the programatic view controller in the example project to see an example of this.
The corner radius can be adjusted manually (this turns off automatic adjustments):
//This will forward the cornerRadius to the button's layer and turn off automatic adjustments
button.cornerRadius = 6.0;
Color
The text and border color are adjusted together. For normal state they can be changed using either:
button.tintColor = [UIColor greenColor];
or:
[button setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
Disabled state can be adjusted using:
[button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled]; //Default is [UIColor grayColor]
The text color when highlighted should be changed using:
[self setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted]; //Default is [UIColor whiteColor]
RDMBorderedButton的更多相关文章
随机推荐
- 云存储(Swift+Keystone)部署策略
Swift是OpenStack的对象存储模块,Keystone是OpenStack的权限验证模块.可以于这两个模块搭建一个较为完善的云存储系统. 1.官方方案 云存储的服务器分三种类型: 验证节点 A ...
- JBoss 实战(1)
转自:https://www.cnblogs.com/aiwz/p/6154594.html JBOSS的诞生 1998年,在硅谷SUN公司的SAP实验室,一个年轻人正坐在电脑前面思考,然后写着什么东 ...
- 读取XML文件(XmlNode和XmlElement区别)
XmlNode和XmlElement区别.这两个类的功能极其类似(因为我们一般都是在对Element节点进行操作). 1.通过继承关系XmlElement继承自XmlLinkedNode又继承自Xml ...
- mongodb int型id 自增
mongo的c#客户端提供了接口IIdGenerator,有guid和objectid等几种实现,但没有int型id的实现 接口主要2个方法,一个IsEmpty返回bool,判断当前id值是否是空(估 ...
- Java基础教程(17)--接口
就像类一样,接口也是引用类型.它可以包含常量,方法签名,默认方法,静态方法和嵌套类型.在接口中,只有默认方法和静态方法有方法体.但不同于类,接口无法实例化,它只能被类实现或被其他接口继承. 一.定 ...
- 【转】Apache服务器的下载与安装
PHP的运行必然少不了服务器的支持,何为服务器?通俗讲就是在一台计算机上,安装个服务器软件,这台计算机便可以称之为服务器,服务器软件和计算机本身的操作系统是两码事,计算机自身的操作系统可以为linux ...
- HDU 2669 Romantic 扩展欧几里德---->解不定方程
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- ASP.NET MVC 简单事务添加
ASP.NET MVC 简单事务 //实例化查询上下文 using ( BookStoreEntities db = new BookStoreEntities()) { //找到需要价格和名称的数据 ...
- apply、call、bind有什么区别?
使用 apply var a = { name : "Cherry", func1: function () { console.log(this.name) }, func2: ...
- 虚拟主机服务器php fsockopen函数被禁用的解决方法
为了服务器安全考虑很多主机商禁用了php的fsockopen函数,昨天进博客,使用cos-html-cache生成静态文件,尼玛提示: Warning: fsockopen() has been di ...