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的更多相关文章
随机推荐
- Term Weighting
对文本分词后,接下来需要对分词后的每个term计算一个权重,重要的term应该给与更高的权重.举例来说,“什么产品对减肥帮助最大?”的term weighting结果可能是: “什么 0.1,产品 0 ...
- cgroups简单使用
Cgroups控制系统资源的分配(cpu.mem.io) 1.cgroups概述 CGroup是Linux内核提供的可以限制.隔离进程组 (process groups) 所使用的物理资源 (如 cp ...
- Beta阶段——Scrum 冲刺博客第三天
一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 实现部分question页面的制作,制作内容包括题目序号的制作,同时在最后 ...
- JavaScript 作用域(Scope)详解
先对需要用到的名词解释一下,再通过例子深入理解 一.什么是作用域(Scope) [[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供ja ...
- C#语法之委托和事件
从大学就开始做C#这块,也做C#几年了,最近又从ios转回.Net,继续做C#,之前也没有写博客的习惯,写博客也是从我做ios的时候开始的,现在既然又做回了.net,那就写点关于.Net的博客,可能在 ...
- C#中Cookie,Session,Application的用法与区别?
1.Application 储存在服务端,没有时间限制,服务器关闭即销毁(前提是自己没写销毁方法) 2.Session 储存在服务端,客户端(浏览器)关闭即销毁(若长时间不使用 且 浏览器未关闭的情况 ...
- sql中非存储过程定义参数并使用
DECLARE @dt datetime SET @dt=GETDATE()--1.短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),@dt,120) ...
- ASP.NET Url 重写
protected void Application_BeginRequest(object sender, EventArgs e) { string url = Request.AppRelati ...
- 番外篇 之 JS调用
C#Winform调用JS 执行JS(Javascript)方法 课前知识储备: 1, ...
- Android全屏的两种方法
在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...