iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置
自定义控件之调整按钮中子控件(图片和文字)的位置
其实还有一种是在storyBoard中实现的,只需要设置对应空间的左右间距:
这里实现前面两种自定义的方式
一:imageRectForContentRect/titleRectForContentRect
自定义一个按钮控件在系统自带的位置设置方法中实现对应子控件位置调整
- /**
- * 设置内部图标的frame
- */
- - (CGRect)imageRectForContentRect:(CGRect)contentRect
- {
- CGFloat imageY = ;
- CGFloat imageW = self.height;
- CGFloat imageH = imageW;
- CGFloat imageX = self.width - imageW;
- return CGRectMake(imageX, imageY, imageW, imageH);
- }
- /**
- * 设置内部文字的frame
- */
- - (CGRect)titleRectForContentRect:(CGRect)contentRect
- {
- CGFloat titleY = ;
- CGFloat titleX = ;
- CGFloat titleH = self.height;
- CGFloat titleW = self.width - self.height;
- return CGRectMake(titleX, titleY, titleW, titleH);
- }
然后做进步一的优化:
- - (id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- // 内部图标居中
- self.imageView.contentMode = UIViewContentModeCenter;
- // 文字对齐
- self.titleLabel.textAlignment = NSTextAlignmentRight;
- // 文字颜色
- [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- // 字体
- self.titleLabel.font = HMNavigationTitleFont;
- // 高亮的时候不需要调整内部的图片为灰色
- self.adjustsImageWhenHighlighted = NO;
- }
- return self;
- }
- - (void)setTitle:(NSString *)title forState:(UIControlState)state
- {
- [super setTitle:title forState:state];
- // 1.计算文字的尺寸
- CGSize titleSize = [title sizeWithFont:self.titleLabel.font];
- // 2.计算按钮的宽度
- self.width = titleSize.width + self.height + ;
- }
二:类似签名的自定义View在layoutSubViews里面实现子控件位置的调整:
创建一个继承自UIButton得子类,实现响应的自定义子控件的方法
- - (id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- //设置文字颜色
- [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
- //设置文字大小
- self.titleLabel.font = [UIFont boldSystemFontOfSize:];
- //设置按钮的图片(普通和选中)
- [self setImage:[UIImage imageNamed:@"navigationbar_arrow_down"] forState:UIControlStateNormal];
- [self setImage:[UIImage imageNamed:@"navigationbar_arrow_up"] forState:UIControlStateSelected];
- }
- return self;
- }
- - (void)layoutSubviews
- {
- [super layoutSubviews];
- // 如果仅仅是调整按钮内部titleLabel和imageView的位置,那么在layoutSubviews中单独设置位置即可
- // 1.计算titleLabel的frame
- self.titleLabel.x = self.imageView.x - ;
- // 2.计算imageView的frame
- self.imageView.x = CGRectGetMaxX(self.titleLabel.frame);
- }
- - (void)setTitle:(NSString *)title forState:(UIControlState)state
- {
- [super setTitle:title forState:state];
- // 只要修改了文字,就让按钮重新计算自己的尺寸
- [self sizeToFit];
- }
- - (void)setImage:(UIImage *)image forState:(UIControlState)state
- {
- [super setImage:image forState:state];
- // 只要修改了图片,就让按钮重新计算自己的尺寸
- [self sizeToFit];
- }
最后来看看Swift怎么去实现:
- class ShopButton: UIButton {
- var shop: Shop? {
- didSet {
- print(shop)
- // 重写set方法
- /*
- // 错误写法
- self.imageView?.image = UIImage(named: shop!.icon)
- self.titleLabel?.text = shop!.name
- */
- self.setTitle(shop!.name, forState: UIControlState.Normal)
- self.setImage(UIImage(named: shop!.icon), forState: UIControlState.Normal)
- }
- }
- class func shopView(shop: Shop) -> ShopButton{
- let btn:ShopButton = ShopButton()
- btn.shop = shop
- return btn
- }
- /*
- override func titleRectForContentRect(contentRect: CGRect) -> CGRect {
- return CGRectMake(0, contentRect.size.width, contentRect.size.width, contentRect.size.height - contentRect.size.width)
- }
- override func imageRectForContentRect(contentRect: CGRect) -> CGRect {
- return CGRectMake(0, 0, contentRect.size.width, contentRect.size.width)
- }
- */
- override func layoutSubviews() {
- super.layoutSubviews()
- print(self.frame)
- let width: CGFloat = self.frame.size.width
- let height: CGFloat = self.frame.size.height
- self.imageView?.frame = CGRectMake(, , width, width)
- self.titleLabel?.frame = CGRectMake(, width, width, height - width)
- }
- }
其实思路非常简单,就是设置对应控件的frame就可以,当然如果真的不想写那么就直接使用吧,使用方法有两种直接创建设置对应的子控件需要的值或者在XIB或StoryBoard中给对应的UIButton控件设置为我们自定义的类就可以。
iOS开发——UI高级OC篇&自定义控件之调整按钮中子控件(图片和文字)的位置的更多相关文章
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
- iOS开发——项目实战OC篇&类QQ黏性按钮(封装)
类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...
- Qt编写自定义控件8-动画按钮组控件
前言 动画按钮组控件可以用来当做各种漂亮的导航条用,既可以设置成顶部底部+左侧右侧,还自带精美的滑动效果,还可以设置悬停滑动等各种颜色,原创作者雨田哥(QQ:3246214072),驰骋Qt控件界多年 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- ios开发——实用技术篇OC篇&iOS的主要框架
iOS的主要框架 阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...
- iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势
使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- iOS开发——实战总结OC篇&网易彩票开发知识点总结
网易彩票开发知识点总结 关于网易彩票开发中遇到了不少的坑,弄了好久才弄懂,或者有些犹豫很久没用就不记得了,所以这里就总结了一下,希望以后不会忘记,就算忘记也能快速查看! /************** ...
- 【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet
接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbut ...
随机推荐
- Mac OS10.9 下python开发环境(eclipse)以及自然语言包NLTK的安装与注意
折腾了大半天,终于把mbp上python自然语言开发环境搭建好了. 第一步,安装JDK1.7 for mac MacOS10.9是自带python2.7.5的,够用,具体的可以打开终端输入python ...
- Spring Batch的事务– Part 3: 略过和重试
原文:https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/ This i ...
- TortoiseGit's Settings
将鼠标停放在Settings-TortoiseGit窗体上的editbox,checkbox上,有些会弹出有用的提示信息. 2.35.1. General settings: 设定自己偏好的语言,Gi ...
- CentOS7 network
- 清空easyui datagrid
$('#grid').datagrid("loadData",{total:0,rows:[]});
- 【转】jsp页面中jstl标签详解
原文地址: JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实 ...
- C++11无限制的unions
[C++11无限制的unions] 在标准 C++ 中,并非任意的类型都能做为 union 的成员.比方说,带有 non-trivial 构造函数的类型就不能是 union 的成员.在新的标准里,移除 ...
- hdu 4815 Little Tiger vs. Deep Monkey(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=4815 Description A crowd of little animals is visiting a m ...
- POJ 2886Who Gets the Most Candies?(线段树)
POJ 2886 题目大意是说有n个人围成一圈,游戏的起点是k,每个人持有一个数字(非编号)num,每次当前的人退出圈,下一个人是他左边的第num个(也就是说下一个退出的是k+num, k可以为负数, ...
- 转载php在IIS中运行
在IIS中配置PHP运行环境简单步骤 安装 IIS 7.0 打开 Control Panel\Programs\Programs and Features\Turn Windows features ...