自定义控件之调整按钮中子控件(图片和文字)的位置

其实还有一种是在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篇&自定义控件之调整按钮中子控件(图片和文字)的位置的更多相关文章

  1. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  2. iOS开发——项目实战OC篇&类QQ黏性按钮(封装)

    类QQ粘性按钮(封装) 那个,先来说说原理吧: 这里原理就是,在界面设置两个控件一个按钮在上面,一个View在下面(同样大小),当我们拖动按钮的时候显示下面的View,view不移动,但是会根据按钮中 ...

  3. Qt编写自定义控件8-动画按钮组控件

    前言 动画按钮组控件可以用来当做各种漂亮的导航条用,既可以设置成顶部底部+左侧右侧,还自带精美的滑动效果,还可以设置悬停滑动等各种颜色,原创作者雨田哥(QQ:3246214072),驰骋Qt控件界多年 ...

  4. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  5. ios开发——实用技术篇OC篇&iOS的主要框架

    iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...

  6. iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

    使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...

  7. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  8. iOS开发——实战总结OC篇&网易彩票开发知识点总结

    网易彩票开发知识点总结 关于网易彩票开发中遇到了不少的坑,弄了好久才弄懂,或者有些犹豫很久没用就不记得了,所以这里就总结了一下,希望以后不会忘记,就算忘记也能快速查看! /************** ...

  9. 【iOS开发-56】案例BUG:button的enabled、控件的userInteractionEnabled以及两种提示框UIAlert和UIActionSheet

    接上述案例找BUG:[iOS开发-51]案例学习:动画新写法.删除子视图.视图顺序.延迟方法.button多功能使用方法及icon图标和启动页设置 (1)BUG:答案满了就不能再点击optionbut ...

随机推荐

  1. 面积最大的全1子矩阵--九度OJ 1497

    题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行是 ...

  2. ipv4头部分析,读书笔记3

    ip头部最长是60字节,前面的20字节是固定的,选项可加上40字节 4位版本号--- 对于ipv4来说呢,就是4 4位头部长度 ---  表示 有多小个32bit(4字节),4位最大表示数是15啦,也 ...

  3. Python 学习笔记(五)杂项

    1. Assert assert len(unique_characters) <= 10, 'Too many letters' #…等价于: if len(unique_characters ...

  4. _margin和margin的区别

    _margin和margin的区别 _margin和margin的区别 Question: margin:15px 300px 0px 100px; height:72px; width:188px; ...

  5. 【转】Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(proces ...

  6. 编译python3

    安装环境 yum install gcc yum install zlib-devel yum install make 下载python版本 wget http://www.python.org/f ...

  7. 第三百五十八天 how can I 坚持

    万事要有度,不要话唠,也不能不说,把握好分寸,今天貌似又说多了. 加了天班,理了个发,还有老爸明天来北京. 还有同学聚会没去,还有金龙让去吃鱼,没去. 还有.小米视频通话还行,能远程控制桌面, 还有, ...

  8. HDU3033I love sneakers!(分组背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=3033 本题的意思就是说现在有n种牌子的鞋子,每种品牌有一些不同的鞋,每双鞋子都有一个特定的权值,现在要求每种品牌 ...

  9. POJ2299Ultra-QuickSort (线段树和归并排序的解法)

    题目大意就是说帮你给一些(n个)乱序的数,让你求冒泡排序需要交换数的次数(n<=500000) 此题最初真不会做,我也只是在听了章爷的讲解后才慢慢明白过来的 首先介绍线段树的解法: 我们先将原数 ...

  10. ssh 框架整合试例 (spring+struts2+hibernate)

    1.首先用Eclipse创建一个web项目(Eclipse EE 版) new->Other-> 输入web 然后选择Dynamic Web Project->next-> 输 ...