美文网首页
UIButton图片文字排版

UIButton图片文字排版

作者: ChiralKing | 来源:发表于2019-11-14 17:07 被阅读0次

    在平时的开发中,我们会碰到不同排版按钮的需求,按钮默认的排版为图片居左,文字居右。不同于此的就需要我们进行重写。目前我已知的有两种方式:
    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)
    
    

    如图:


    屏幕快照 2019-09-03 下午4.35.02.png

    因为有时候title的内容可能会比较多,所以我们要将titleLabel的left和right拉伸至button边缘,拉伸的距离为(selfWidth - titleWidth) / 2,也就是titleNowX,因为是向外扩展,所以是减去。则title的偏移量最终的结果

    titleEdgeInsets = UIEdgeInsetsMake(titleNowY - titleOriginY, titleNowX - titleOriginX - titleNowX, titleOriginY - titleNowY, titleOriginX - titleNowX - titleNowX)
    
    

    对比一下


    屏幕快照 2019-09-03 下午4.43.40.png 屏幕快照 2019-09-03 下午4.44.10.png

    其他情况类比,本文结束。

    相关文章

      网友评论

          本文标题:UIButton图片文字排版

          本文链接:https://www.haomeiwen.com/subject/ekphyctx.html