在平时的开发中,我们会碰到不同排版按钮的需求,按钮默认的排版为图片居左,文字居右。不同于此的就需要我们进行重写。目前我已知的有两种方式:
1.通过改变titleLabel和imageView的rect进行重新布局
2.通过改变titleLabel和imageView的偏移量重新布局
两种方式都能实现需求,以前我也经常使用第一种方式去实现,这种方式好理解,但是每遇到一种排版就得写一个button子类或者写一段不是很优雅的代码。第二种方式(本文讲解)比较难以理解,但是兼容性比较好,只需要写一个子类,且比较优雅。最近通过查找资料和实践得到以下结论:
偏移量的值 = 现位置的值 - 原位置的值 (其中这个现位置你需要去想象你需要的排版的位置是怎样的);
偏移方向:向内侧偏移为正,向外侧偏移为负
其中top和bottom,left和right,我们只需要得到其中一个方向的偏移量,如果在宽高不需要改变的情况下,相对方向的偏移量则为其相反数
我们需要写一个子类,为其添加方法来进行布局
以图片在上,文字在下为例子:
/**
需要的数据
**/
//间距
CGFloat padding = 10;
//按钮尺寸
CGFloat selfWidth = self.frame.size.width;
CGFloat selfHeight = self.frame.size.height;
//图片高度 + 间距 + 文字高度(竖直方向上)
CGFloat contentHeight = imageHeight + padding + titleHeight;
//原图片位置:
CGFloat imageOriginX = self.imageView.frame.origin.x;
CGFloat imageOriginY = self.imageView.frame.origin.y;
//原文字label位置
CGFloat titleOriginX = self.titleLabel.frame.origin.x;
CGFloat titleOriginY = self.titleLabel.frame.origin.y;
//图片文字尺寸
CGFloat titleHeight = self.titleLabel.frame.size.height;
CGFloat titleWidth = self.titleLabel.frame.size.width;
CGFloat imageHeight = self.imageView.frame.size.height;
CGFloat imageWidth = self.imageView.frame.size.width;
//现图片位置
CGFloat imageNowY = (selfHeight - contentHeight) / 2;
CGFloat imageNowX = (selfWidth - imageWidth) / 2;
//现文字位置
CGFloat titleNowY = (selfHeight - contentHeight) / 2 + imageHeight + padding;
CGFloat titleNowX = (selfWidth - titleWidth) / 2;
则图片在top方向的偏移量为:imageNowY - imageOriginY
left方向的偏移量为:imageNowX - imageOriginX
文字在top方向的偏移量为:titleNowY - titleOriginY
left方向的偏移量为: titleNowX - titleOriginX
则最后的结果为:
titleEdgeInsets = UIEdgeInsetsMake(titleNowY - titleOriginY, titleNowX - titleOriginX, titleOriginY - titleNowY, titleOriginX - titleNowX)
imageEdgeInsets = UIEdgeInsetsMake(imageNowY - imageOriginY, imageNowX - imageOriginX, imageOriginY - imageNowY, imageOriginX - imageNowX)
如图:
因为有时候title的内容可能会比较多,所以我们要将titleLabel的left和right拉伸至button边缘,拉伸的距离为(selfWidth - titleWidth) / 2,也就是titleNowX,因为是向外扩展,所以是减去。则title的偏移量最终的结果
titleEdgeInsets = UIEdgeInsetsMake(titleNowY - titleOriginY, titleNowX - titleOriginX - titleNowX, titleOriginY - titleNowY, titleOriginX - titleNowX - titleNowX)
对比一下
其他情况类比,本文结束。