UIButton图片文字位置的四种情况
我们在做项目的过程中经常会遇到各定制UIButton
1.左边图片,右边文字
2.左边文字,右边图片
3.上边图片,下边文字
4.上边文字,下边图片
针对这四种情况
使用UIButton的category实现
.h文件实现内容
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger,SDButtonStyle) {
SDButtonStyleNormal = 0,
SDButtonStyleTitleLeft,
SDButtonStyleTitleUp,
SDButtonStyleTitleDown
};
@interface UIButton (ButtonStyle)
@property (nonatomic, assign) CGRect imageRect;
@property (nonatomic, assign) CGRect titleRect;
@property (nonatomic, assign) SDButtonStyle buttonStyle;
@property (nonatomic, assign) CGFloat verSpace;
@end
.m文件实现内容
#import "UIButton+ButtonStyle.h"
#import <objc/runtime.h> @implementation UIButton (ButtonStyle) + (void)load {
Method imageOriginalMethod = class_getInstanceMethod([self class], @selector(imageRectForContentRect:));
Method imageSwizzledMethod = class_getInstanceMethod([self class], @selector(sd_imageRectForContentRect:));
method_exchangeImplementations(imageOriginalMethod, imageSwizzledMethod); Method titleOriginalMethod = class_getInstanceMethod([self class], @selector(titleRectForContentRect:));
Method titleSwizzledMethod = class_getInstanceMethod([self class], @selector(sd_titleRectForContentRect:));
method_exchangeImplementations(titleOriginalMethod, titleSwizzledMethod);
} - (CGRect)sd_imageRectForContentRect:(CGRect)contentRect {
if (!CGRectIsEmpty(self.imageRect) && !CGRectEqualToRect(self.imageRect, CGRectZero)) {
return self.imageRect;
} CGRect imgRect = [self sd_imageRectForContentRect:contentRect];
CGRect titRect = [self sd_titleRectForContentRect:contentRect];
if (self.buttonStyle == SDButtonStyleTitleLeft) {
imgRect.origin.x = CGRectGetMaxX(titRect) - CGRectGetWidth(imgRect);
return imgRect;
}
if (self.buttonStyle == SDButtonStyleTitleDown) {
imgRect.origin.x = (CGRectGetWidth(contentRect) - CGRectGetWidth(imgRect))/2.f;
imgRect.origin.y = ceilf((CGRectGetHeight(contentRect) - CGRectGetHeight(titRect) - CGRectGetHeight(imgRect))) /2.f;
return imgRect;
}
if (self.buttonStyle == SDButtonStyleTitleUp) {
imgRect.origin.x = (CGRectGetWidth(contentRect) - CGRectGetWidth(imgRect))/2.f;
imgRect.origin.y = (CGRectGetHeight(contentRect) + CGRectGetHeight(titRect) - CGRectGetHeight(imgRect) + self.verSpace)/2.f;
return imgRect;
}
return imgRect;
} - (CGRect)sd_titleRectForContentRect:(CGRect)contentRect {
if (!CGRectIsEmpty(self.titleRect) && !CGRectEqualToRect(self.titleRect, CGRectZero)) {
return self.titleRect;
} CGRect imgRect = [self sd_imageRectForContentRect:contentRect];
CGRect titRect = CGRectZero;
if (self.buttonStyle == SDButtonStyleTitleLeft) {
titRect = [self sd_titleRectForContentRect:contentRect];
titRect.origin.x = CGRectGetMinX(imgRect) - self.verSpace;
return titRect;
} CGFloat height = CGRectGetHeight(contentRect);
CGFloat width = CGRectGetWidth(contentRect); if (self.buttonStyle == SDButtonStyleTitleDown) {
titRect = [self sd_titleRectForContentRect:CGRectMake(0, 0, 3 * width, height)];
titRect.origin.x = ceilf((width - CGRectGetWidth(titRect))/2.f);
titRect.origin.y = ceilf((height - CGRectGetHeight(titRect) + CGRectGetHeight(imgRect))/2.f + self.verSpace);
return titRect;
}
if (self.buttonStyle == SDButtonStyleTitleUp) {
titRect = [self sd_titleRectForContentRect:CGRectMake(0, 0, 3 * width, height)];
titRect.origin.x = ceilf((width - CGRectGetWidth(titRect))/2.f);
titRect.origin.y = ceilf((height - CGRectGetHeight(titRect) - CGRectGetHeight(imgRect) - self.verSpace ) /2.f);
return titRect;
}
return [self sd_titleRectForContentRect:contentRect];
} #pragma mark --- AssociatedObject - (void)setImageRect:(CGRect)imageRect {
NSValue *value = [NSValue valueWithCGRect:imageRect];
objc_setAssociatedObject(self, @selector(imageRect), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (CGRect)imageRect {
NSValue *value = objc_getAssociatedObject(self, @selector(imageRect));
return [value CGRectValue];
} - (void)setTitleRect:(CGRect)titleRect {
NSValue *value = [NSValue valueWithCGRect:titleRect];
objc_setAssociatedObject(self, @selector(titleRect), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (CGRect)titleRect {
NSValue *value = objc_getAssociatedObject(self, @selector(titleRect));
return [value CGRectValue];
} - (CGFloat)verSpace {
NSNumber *value = objc_getAssociatedObject(self, @selector(verSpace));
return [value floatValue];
} - (void)setVerSpace:(CGFloat)verSpace {
NSNumber *value = [NSNumber numberWithFloat:verSpace];
objc_setAssociatedObject(self, @selector(verSpace), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (void)setButtonStyle:(SDButtonStyle)buttonStyle {
objc_setAssociatedObject(self, @selector(buttonStyle), @(buttonStyle), OBJC_ASSOCIATION_ASSIGN);
} - (SDButtonStyle)buttonStyle {
return [objc_getAssociatedObject(self, @selector(buttonStyle)) integerValue];
} @end
UIButton图片文字位置的四种情况的更多相关文章
- Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种
http://blog.csdn.net/yanzi1225627/article/details/8633872 第二种方法也要新建一个图片+文字的xml布局文件,然后写一个类继承自LinearLa ...
- UIButton 图片文字位置
在实际开发过程中经常在按钮上添加文字和图片,位置和图片的位置根据需求放置也是不一样的.下面实现了各种显示方式,如下图: UIButton+LSAdditions.h // // UIButton+LS ...
- UIButton图片文字控件位置自定义(图片居右文字居左、图片居中文字居中、图片居左文字消失等)
在开发中经常会碰到需要对按钮中的图片文字位置做调整的需求.第一种方式是通过设置按钮中图片文字的偏移量.通过方法setTitleEdgeInsets和setImageEdgeInsets实现 代码如下: ...
- iOS UIButton 图片文字上下垂直布局 解决方案
实现如图所示效果: 这是一个UIButton,需要改变image和title相对位置. 解决如下: //设置文字偏移:向下偏移图片高度+向左偏移图片宽度 (偏移量是根据[图片]大小来的,这点是关键)b ...
- JS生成某个范围的随机数(四种情况)
前言: JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉 ...
- SET Transaction Isolation Level Read语法的四种情况
转自:http://www.cnblogs.com/qanholas/archive/2012/01/04/2312152.html 存储过程:SET Transaction Isolation Le ...
- JS生成某个范围的随机数【四种情况详解】
JS没有现成的函数,能够直接生成指定范围的随机数. 但是它有个函数:Math.random() 这个函数可以生成 [0,1) 的一个随机数. 利用它,我们就可以生成指定范围内的随机数. 而涉及范围的 ...
- 从零开始学习前端JAVASCRIPT — JavaScript中this指向的四种情况
JavaScript中this的四种情况(非严格模式) 1.当this所在函数是事件处理函数时,this指向事件源.2.当this所在函数是构造函数时,this指向new出来的对象.3.this所在函 ...
- 对存在JavaScript隐式类型转换的四种情况的总结
一般存在四种情况,JavaScript会对变量的数据类型进行转换. 目录 * if中的条件会被自动转为Boolean类型 * 会被转为false的数据 * 会被转为true的数据 * 参与+运算都会被 ...
随机推荐
- NavigationView的使用
代码已经分享至github:https://github.com/YanYoJun/NavigationDemo 转载请注明原文链接:http://www.cnblogs.com/yanyojun/p ...
- iOS Programming Dynamic Type 2
iOS Programming Dynamic Type 2 You will need to update two parts of this view controller for ...
- eval()将json 字符串转换为数组
json ={ GW:[{id:"655",mc:"董事"},{id:"656",mc:"书记"},{id:" ...
- 【PostgreSQL-9.6.3】一般视图
PG视图分为两种,一种是物化视图,一种是一般视图.本篇文章主要写一般视图哪些事儿.所谓一般视图,通俗点说,就是由查询语句定义的虚拟表.视图中的数据可能来自一张或多张表. 1. 视图创建语句 CREAT ...
- Node.js——post方式提交的图片如何保存
https://www.cnblogs.com/bruce-gou/p/6399766.html 没有使用express框架,主要是对于 request 的监听,data的时候对数据进行保存,end的 ...
- IOS 面试题系列
随着iOS平台开发的职位的增加,笔试.面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出. 1. Ob ...
- C# 如何发送Http请求
HttpSender是一个用于发送Http消息的轻量C#库,使用非常简单,只需要一两行代码,就能完成Http请求的发送 使用 Nuget,搜索 HttpSender 就能找到这个库 这个库的命名空间是 ...
- vue组件之this指向问题
[问题描述] 返回顶部组件里,用到数据操作.通过方法里改动this数据,但发现直接使用失效 mounted() { window.onscroll=function(){ ) { this.isAct ...
- Hibernate修改操作 删除操作 查询操作 增加操作 增删改查 Hibernate增删查改语句
我用的数据库是MySQL,实体类叫User public class User { private Integer uid; private String username; private Stri ...
- opencv笔记
加载图像: OpenCV支持图像格式Windows位图(bmp),便携式图像格式(pbm,pgm,ppm)和Sun光栅(sr,ras). Mat image = imread( imageName, ...