在开发中,我们经常看到button的各种风格,针对复用性较高的代码,就应该把它封装起来。button上有两个控件titleLabel和imageView,而想要改变这两个控件的位置则需要简单的了解UIButton的两个属性:setImageEdgeInsets和setTitleEdgeInsets。
默认情况下这两个都是居中显示,图片在左侧,文本在右侧。它们的位置也是相对于自己来说的,与button的位置大小没有关系。
//默认图片在左边,文本在右边
[btn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[btn setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
因为常用,所以就根据图片相对文本的位置做了封装:
- 为了适应图片或者文本,设置了一个BooL类型的_autoSize判断。
- 设置了图片跟文本的相对位置以及图片跟文本作为整体向上下左右偏移
- 以下是默认图片跟文本的位置,然后作为整体的偏移位置
– (void)layoutBtnSubviews{
CGSize imageSize = self.currentImage.size;
CGSize titleSize = [self.titleLabel getSize];
CGFloat maxWidth = (imageSize.width > titleSize.width) ? imageSize.width : titleSize.width;
CGFloat maxHeight = (imageSize.height > titleSize.height) ? imageSize.height : titleSize.height;
CGRect tempFrame = self.frame;
CGFloat autoWidth = self.frame.size.width;
CGFloat autoHeight = self.frame.size.height;
switch (self.imageStyle)
{
case MMBtnImageStyleDefault: //从图片角度 左 右 上 下
{
switch (self.layoutStyle) //整体偏移的方向
{
case MMBtnLayoutStyleNone:
{
self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight);
if (_autoSize) //默认是自适应
{
autoWidth = imageSize.width + titleSize.width + _space;
if (_minWidth > autoWidth)
{
autoWidth = _minWidth;
}
autoHeight = maxHeight;
if (_minHeight > autoHeight)
{
autoHeight = _minHeight;
}
}
[self setTitleEdgeInsets:UIEdgeInsetsMake(0, _space / 2.0, 0, -_space / 2.0)];
[self setImageEdgeInsets:UIEdgeInsetsMake(0, -_space / 2.0, 0, _space / 2.0)];
}
break;
case MMBtnLayoutStyleLeft:
{
self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space + _offsetMargin, maxHeight);
if (_autoSize)
{
autoWidth = imageSize.width + titleSize.width + _space + _offsetMargin;
if (_minWidth > autoWidth)
{
autoWidth = _minWidth;
}
autoHeight = maxHeight;
if (_minHeight > autoHeight)
{
autoHeight = _minHeight;
}
}
CGFloat offsetX = (autoWidth - titleSize.width - imageSize.width) / 2.0 - _offsetMargin;
[self setTitleEdgeInsets:UIEdgeInsetsMake(0, -offsetX + _space, 0, offsetX - _space)];
[self setImageEdgeInsets:UIEdgeInsetsMake(0, -offsetX, 0, offsetX)];
}
break;
case MMBtnLayoutStyleRight:
{
self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space + _offsetMargin, maxHeight);
if (_autoSize)
{
autoWidth = imageSize.width + titleSize.width + _space + _offsetMargin;
if (_minWidth > autoWidth)
{
autoWidth = _minWidth;
}
autoHeight = maxHeight;
if (_minHeight > autoHeight)
{
autoHeight = _minHeight;
}
}
CGFloat offsetX = - ((autoWidth - titleSize.width - imageSize.width) / 2.0 - _offsetMargin);
[self setTitleEdgeInsets:UIEdgeInsetsMake(0, -offsetX, 0, offsetX)];
[self setImageEdgeInsets:UIEdgeInsetsMake(0, -offsetX - _space, 0, offsetX + _space)];
}
break;
case MMBtnLayoutStyleTop:
{
self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight + _offsetMargin);
if (_autoSize)
{
autoWidth = imageSize.width + titleSize.width + _space;
if (_minWidth > autoWidth)
{
autoWidth = _minWidth;
}
autoHeight = maxHeight + _offsetMargin;
if (_minHeight > autoHeight)
{
autoHeight = _minHeight;
}
}
CGFloat offsetY = (autoHeight - maxHeight) / 2.0 - _offsetMargin;
[self setTitleEdgeInsets:UIEdgeInsetsMake(-offsetY , _space / 2.0, offsetY, -_space / 2.0)];
[self setImageEdgeInsets:UIEdgeInsetsMake(-offsetY, -_space / 2.0, offsetY, _space / 2.0)];
}
break;
case MMBtnLayoutStyleBottom:
{
self.minSize = CGSizeMake(imageSize.width + titleSize.width + _space, maxHeight + _offsetMargin);
if (_autoSize)
{
autoWidth = imageSize.width + titleSize.width + _space;
if (_minWidth > autoWidth)
{
autoWidth = _minWidth;
}
autoHeight = maxHeight + _offsetMargin;
if (_minHeight > autoHeight)
{
autoHeight = _minHeight;
}
}
CGFloat offsetY = -((autoHeight - maxHeight) / 2.0 - _offsetMargin);
[self setTitleEdgeInsets:UIEdgeInsetsMake(-offsetY , _space / 2.0, offsetY, -_space / 2.0)];
[self setImageEdgeInsets:UIEdgeInsetsMake(-offsetY, -_space / 2.0, offsetY, _space / 2.0)];
}
break;
}
}
break;