UIButton的封装

    在开发中,我们经常看到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;

具体的代码参见:https://github.com/MayerFeng/SimpleNavDemo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值