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的数据 * 参与+运算都会被 ...
随机推荐
- CCF|分蛋糕|Java
import java.util.Scanner; public class tyt { public static void main(String[] args) { Scanner in = n ...
- 黑马程序员----java基础:String与StringBuffer及基本数据类型包装类
------- android培训.java培训.期待与您交流! ---------- java中一些基础类比如String.StringBuffer和基本数据类型包装类都是非常常见且使用非常频繁的类 ...
- SQL优化基础 使用索引(一个小例子)
按照本文操作和体会,会对sql优化有个基本最简单的了解,其他深入还需要更多资料和实践的学习: 1. 建表: 复制代码代码如下: create table site_user ( id int IDEN ...
- 迅为工业级arm开发板i.MX6DL开发板软件硬件全开源
i.MX6是基于ARM Cortex™-A9架构的高扩展性多核系列应用处理器,促进了如高稳定性工业平板电脑.差异化智能本.前装车载中控系统和超高清电子书阅读器等新一代应用的发展.强劲的3D图形加速引擎 ...
- linux 配置Java、Mysql、Tomcat、Redis开发环境
1.安装四个依赖 以下四个依赖必须按顺序联网安装:yum install glibc.i686yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so ...
- CREATE USER - 创建一个新的数据库用户帐户
SYNOPSIS CREATE USER name [ [ WITH ] option [ ... ] ] where option can be: SYSID uid | [ ENCRYPTED | ...
- filezilla server FTP 安装报错 "could not load TLS network. Aborting start of administration interface"
filezilla server FTP 安装报错 "could not load TLS network. Aborting start of administration inter ...
- linux下查找字符串的命令
1. set命令可以显示出当前shell下所有全局参量定义及其值; 2. 查找并删除当前目录下小文件: find . -type f -size -10k -exec rm {} \; 说明: w ...
- 制作framework&静态库
http://blog.csdn.net/justinjing0612/article/details/7880712 (制作framework) http://blog.sina.com.c ...
- LNMP环境搭建网站
系统:Centos7.4 一台服务器安装nginx.php.mysql 原理不是很懂,但实测如下两种环境下都能成功,这里做下记录: 1.一个干净的系统,从0开始完成所有步骤,完成LNMP搭建 2.已经 ...