【IOS开发基础系列】UIButton专题

1 使用技巧

1.1 样式技巧

1.1.1 圆角边框

1. UITextField四周的圆角

//需要导入框架QuartzCore.framework,并且在当前类中引用#import

textField.layer.cornerRadius = 5.0    


1.1.2 边框颜色

self.layer.borderWidth = 1.0f;      //边框宽度

self.layer.borderColor = [[UIColor colorWithRed:213.0/255 green:213.0/255 blue:213.0/255 alpha:1.0] CGColor];  //边框颜色


1.1.3 文字设置

无法显示:

self.titleLabel.text = [NSString stringWithFormat:@"%d积分",_scoreValue];


正确显示:

[self setTitle:[NSString stringWithFormat:@"%d积分",_scoreValue] forState:UIControlStateNormal];


1.1.4 文字图片同时显示

UIButton上的图片和文字位置调整

http://blog.csdn.net/yongyinmg/article/details/8566365


UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用

http://my.oschina.net/u/1781028/blog/406683


1.1.5 高亮背景色设置

UIButton设置高亮状态下的背景色【原创】

http://blog.it985.com/11543.html


    1,通过按钮的事件来设置背景色

- (void)viewDidLoad {

    [super viewDidLoad];

    UIButton *button1 = [[UIButton alloc]  initWithFrame: CGRectMake(50, 200, 100, 50)];

    [button1 setTitle: @"button1" forState: UIControlStateNormal];

    button1.backgroundColor = [UIColor orangeColor];

    [button1 addTarget: self action: @selector(buttonBackGroundHighlighted:)  forControlEvents: UIControlEventTouchDown];

    [button1 addTarget: self action: @selector(buttonBackGroundNormal:)  forControlEvents: UIControlEventTouchUpInside];

    [self.view addSubview: button1];

}

// button普通状态下的背景色

- (void) buttonBackGroundNormal:(UIButton  *)sender

{

    sender.backgroundColor = [UIColor orangeColor];

}

// button高亮状态下的背景色

- (void)buttonBackGroundHighlighted:(UIButton  *)sender

{

    sender.backgroundColor = [UIColor greenColor];

}

    2, 通过把颜色转换为UIImage来作为按钮不同状态下的背景图片

- (void) viewDidLoad {

    [super viewDidLoad];

    UIButton *button2 = [[UIButton alloc]  initWithFrame: CGRectMake(170, 200, 100, 50)];

    [button2 setTitle: @"button2" forState: UIControlStateNormal];

    [button2 setBackgroundImage: [selfimageWithColor: [UIColor redColor]] forState: UIControlStateNormal];

    [button2 setBackgroundImage: [self imageWithColor: [UIColor grayColor]] forState: UIControlStateHighlighted];

    [self.view addSubview: button2];

}

//  颜色转换为背景图片

- (UIImage  *) imageWithColor:(UIColor *)color {

    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color  CGColor]);

    CGContextFillRect(context, rect);

    UIImage *image =  UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;

}


1.1.6 设置button上的文字和图片上下垂直居中对齐

1.1.6.1 网上代码1

iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片上下垂直居中对齐

http://doc.okbase.net/willingYaTou/archive/38295.html

在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets、titleEdgeInsets、imageEdgeInsets


@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR; // default isUIEdgeInsetsZero

// default is UIEdgeInsetsZero

@property(nonatomic) UIEdgeInsets titleEdgeInsets;                

//default is NO. if YES, shadow reverses to shift between engrave and emboss appearance

@property(nonatomic) BOOL reversesShadowWhenHighlighted; 

@property(nonatomic) UIEdgeInsets imageEdgeInsets;        // default is UIEdgeInsetsZero


UIEdgeInsetsMake

        里面的四个参数表示距离上边界、左边界、下边界、右边界的距离,默认都为零,title/image在button的正中央。


UIKIT_STATIC_INLINE UIEdgeInsets UIEdgeInsetsMake(CGFloat top, CGFloatleft, CGFloat bottom, CGFloat right) {

    UIEdgeInsets insets = {top,left, bottom, right};

    return insets;

}


 self.view.backgroundColor =[UIColor blackColor];

UIButton *button = [UIButton buttonWithType: UIButtonTypeCustom];     //button的类型

button.frame = CGRectMake(100,100,90, 90);    //button的frame

button.backgroundColor = [UIColor cyanColor];    //button的背景颜色


// [button setBackgroundImage: [UIImage imageNamed: @"man_64.png"] forState: UIControlStateNormal];

// 在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets、titleEdgeInsets、imageEdgeInsets

[button setImage: [UIImage imageNamed: @"IconHome@2x.png"] forState: UIControlStateNormal];

//设置image在button上的位置(上top,左left,下bottom,右right)这里可以写负值,对上写-5,那么image就象上移动5个像素

button.imageEdgeInsets = UIEdgeInsetsMake(5, 13, 21, button.titleLabel.bounds.size.width);

[button setTitle: @"首页" forState: UIControlStateNormal];     //设置button的title

button.titleLabel.font = [UIFont systemFontOfSize: 16];    //title字体大小

button.titleLabel.textAlignment= NSTextAlignmentCenter;    //设置title的字体居中

[button setTitleColor: [UIColor whiteColor] forState: UIControlStateNormal]; 

[button setTitleColor: [UIColor grayColor] forState: UIControlStateHighlighted];    

button.titleEdgeInsets = UIEdgeInsetsMake(71, -button.titleLabel.bounds.size.width-50, 0, 0);//设置title在button上的位置(上top,左left,下bottom,右right)

[button addTarget: self action: @selector(tap) forControlEvents: UIControlEventTouchUpInside];

[self.view addSubview: button];


//button相应的事件

- (void) tap {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: @"hello" message: @"willingseal" delegate: self cancelButtonTitle: @"ok" otherButtonTitles: nil];

    [alertView show];

}

效果图:我这里使用的image是64*64的


1.1.6.2 网上代码2

iOS UIButton设置图片文字垂直排列

http://my.oschina.net/sayonala/blog/198376


      经过一下午的查阅资料及尝试,最终解决了在图片和文字垂直排列的情况下,如果文字长度变化会导致图片位置变动的问题,最开始采用了网上比较多的做法,做法如下:

@interface UIButton (UIButtonExt) 

- (void) centerImageAndTitle: (float) space; 

- (void) centerImageAndTitle; 

@end 


@implementation UIButton (UIButtonExt) 

- (void)centerImageAndTitle: (float) spacing 

{     

    // get the sizeof the elements here for readability 

    CGSizeimageSize = self.imageView.frame.size; 

    CGSizetitleSize = self.titleLabel.frame.size; 


    // get the height they will take up as a unit 

    CGFloattotalHeight = (imageSize.height + titleSize.height + spacing); 


    // raise the image and push it right to center it 

    self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight -imageSize.height), 0.0, 0.0, - titleSize.width); 


    // lower the text and push it left to center it 

    self.titleEdgeInsets = UIEdgeInsetsMake(0.0, - imageSize.width, -(totalHeight - titleSize.height),0.0);     


- (void) centerImageAndTitle 

    const intDEFAULT_SPACING = 6.0f; 

    [self centerImageAndTitle: DEFAULT_SPACING]; 

 } 

@end


        后面经过测试,如果button的文字长度变更,会导致图片位置变化,经过多次修改UIEdgeInsets的值也没有达到期望效果,最终采用集成UIButton类,重写layoutSubviews函数实现,特将成果记录一下,以便后续查阅。


1.1.6.3 正式开发用代码

-(void) setButtonContentCenter: (UIButton*) btn

{

    CGSize imgViewSize, titleSize, btnSize;

    UIEdgeInsets imageViewEdge, titleEdge;

    CGFloat heightSpace = 10.0f;


    //设置按钮内边距

    imgViewSize = btn.imageView.bounds.size;

    titleSize = btn.titleLabel.bounds.size;

    btnSize = btn.bounds.size;


    imageViewEdge =UIEdgeInsetsMake(heightSpace,0.0, btnSize.height - imgViewSize.height - heightSpace, - titleSize.width);

    [btn setImageEdgeInsets: imageViewEdge];

    titleEdge = UIEdgeInsetsMake(imgViewSize.height + heightSpace, - imgViewSize.width, 0.0, 0.0);

    [btn setTitleEdgeInsets: titleEdge];

}


2参考链接

iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片上下垂直居中对齐

http://doc.okbase.net/willingYaTou/archive/38295.html

UIButton的titleEdgeInsets和imageEdgeInsets属性

http://blog.csdn.net/worldzhy/article/details/41284157

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容