UIButton 自定义子布局 实现图文排版

效果图

这里写图片描述

代码示例

//
//  LYUContentLayoutBtn.swift
//  LYUMVVMKit
//
//  Created by LYU on 2018/5/24.
//  Copyright © 2018年 LYU. All rights reserved.
//

import UIKit

enum LYUButtonLayoutStyle {
    case ImageLeft  /// 图片居左 文字配合间距 整体垂直方向居中
    case ImageRight /// 图片居右 文字配合间距 整体垂直方向居中
    case ImageTop   /// 图片居上  文字配合间距 整体水平方向居中
    case ImageBottom /// 图片居下 文字配合间距 整体水平方向居中
}

class LYUContentLayoutBtn: UIButton {
   private(set) fileprivate var imgSize:CGSize = CGSize.zero;
   private(set) fileprivate var style:LYUButtonLayoutStyle = .ImageTop;
   private(set) fileprivate var space:CGFloat = 0.0;


    /// layout btn subviews
    ///
    /// - Parameters:
    ///   - style: layout style
    ///   - imgSize: img size
    ///   - space: space
    func layoutContent(style:LYUButtonLayoutStyle, imgSize:CGSize, space:CGFloat){
        self.style = style;
        self.imgSize = imgSize;
        self.space = space;
        /// 强制当前loop刷新UI
        setNeedsLayout();
        layoutIfNeeded();
    }


    override func layoutSubviews() {
        super.layoutSubviews();
        let size = self.bounds.size;
        switch self.style {
        case .ImageTop:
            self.imageView?.frame = CGRect(x: (size.width - self.imgSize.width)/2.0, y: 0, width: self.imgSize.width, height: self.imgSize.height);
            let hegiht = self.currentTitle!.textHeight(font: self.titleLabel!.font, width: size.width);

            self.titleLabel?.frame = CGRect(x: 0, y: self.imgSize.height + space, width: size.width, height: min(hegiht, size.height - self.imgSize.height - self.space));
        case .ImageBottom:
             self.imageView?.frame = CGRect(x: (size.width - self.imgSize.width)/2.0, y: size.height - self.imgSize.height, width: self.imgSize.width, height: self.imgSize.height);
            var hegiht = self.currentTitle!.textHeight(font: self.titleLabel!.font, width: size.width);
             hegiht = min(hegiht, size.height - self.imgSize.height - self.space);
             self.titleLabel?.frame = CGRect(x: 0, y: size.height - hegiht - self.space - self.imgSize.height, width: size.width, height: hegiht);
        case .ImageLeft:
            self.imageView?.frame = CGRect(x: 0, y: (size.height - self.imgSize.height)/2.0, width: self.imgSize.width, height: self.imgSize.height);
          var hegiht = self.currentTitle!.textHeight(font: self.titleLabel!.font, width: size.width);
            hegiht = min(hegiht, size.height)
            self.titleLabel?.frame = CGRect(x: self.imgSize.width + self.space, y: (size.height - hegiht)/2.0, width: (size.width - self.imgSize.width - self.space), height: hegiht);
        case .ImageRight:
            self.imageView?.frame = CGRect(x: size.width - self.imgSize.width, y: (size.height - self.imgSize.height)/2.0, width: self.imgSize.width, height: self.imgSize.height);

            var hegiht = self.currentTitle!.textHeight(font: self.titleLabel!.font, width: size.width);
            hegiht = min(hegiht, size.height)
            self.titleLabel?.frame = CGRect(x: 0, y: (size.height - hegiht)/2.0, width: size.width - self.space - self.imgSize.width, height: hegiht);
        }
    }

}

调用示例


import UIKit

class ViewController: UIViewController {

    var imageLeftBtn:LYUContentLayoutBtn = {
        let btn = LYUContentLayoutBtn();
        btn.setImage(#imageLiteral(resourceName: "read_share.png"), for: .normal);
        btn.setTitle("分享", for: .normal);
        btn.setTitleColor(UIColor.init(hexString: "787878"), for: .normal);
        btn.titleLabel?.textAlignment = .left;
        btn.titleLabel?.font = FONT(28);
        btn.layoutContent(style:LYUButtonLayoutStyle.ImageLeft, imgSize: CGSize(width: FIT_WIDTH(102), height: FIT_WIDTH(102)), space: FIT_WIDTH(18));
        btn.backgroundColor = UIColor.cyan;
        return btn;
    }()


    var imageRightBtn:LYUContentLayoutBtn = {
        let btn = LYUContentLayoutBtn();
        btn.setImage(#imageLiteral(resourceName: "read_share.png"), for: .normal);
        btn.setTitle("分享", for: .normal);
        btn.setTitleColor(UIColor.init(hexString: "787878"), for: .normal);
        btn.titleLabel?.textAlignment = .left;
        btn.titleLabel?.font = FONT(28);
        btn.layoutContent(style:LYUButtonLayoutStyle.ImageRight, imgSize: CGSize(width: FIT_WIDTH(102), height: FIT_WIDTH(102)), space: FIT_WIDTH(18));
        btn.backgroundColor = UIColor.cyan;
        return btn;
    }()




    var imageTopBtn:LYUContentLayoutBtn = {
        let btn = LYUContentLayoutBtn();
        btn.setImage(#imageLiteral(resourceName: "read_share.png"), for: .normal);
        btn.setTitle("分享", for: .normal);
        btn.setTitleColor(UIColor.init(hexString: "787878"), for: .normal);
        btn.titleLabel?.textAlignment = .center;
        btn.titleLabel?.font = FONT(28);
        btn.layoutContent(style:LYUButtonLayoutStyle.ImageTop, imgSize: CGSize(width: FIT_WIDTH(102), height: FIT_WIDTH(102)), space: FIT_WIDTH(18));
        btn.backgroundColor = UIColor.cyan;
        return btn;
    }()


    var imageBottomBtn:LYUContentLayoutBtn = {
        let btn = LYUContentLayoutBtn();
        btn.setImage(#imageLiteral(resourceName: "read_share.png"), for: .normal);
        btn.setTitle("分享", for: .normal);
        btn.setTitleColor(UIColor.init(hexString: "787878"), for: .normal);
        btn.titleLabel?.textAlignment = .center;
        btn.titleLabel?.font = FONT(28);
        btn.layoutContent(style:LYUButtonLayoutStyle.ImageBottom, imgSize: CGSize(width: FIT_WIDTH(102), height: FIT_WIDTH(102)), space: FIT_WIDTH(18));
        btn.backgroundColor = UIColor.cyan;
        return btn;
    }()


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.imageLeftBtn);
        self.view.addSubview(self.imageRightBtn)
        self.view.addSubview(self.imageTopBtn)
        self.view.addSubview(self.imageBottomBtn)

        self.imageLeftBtn.snp.makeConstraints { (make) in
            make.leftMargin.equalTo(FIT_WIDTH(20));
            make.topMargin.equalTo((FIT_WIDTH(100)));
            make.width.equalTo(FIT_WIDTH(180));
            make.height.equalTo(FIT_WIDTH(102));
        }


        self.imageRightBtn.snp.makeConstraints { (make) in

            make.leftMargin.equalTo(FIT_WIDTH(20));
            make.topMargin.equalTo((FIT_WIDTH(250)));
            make.width.equalTo(FIT_WIDTH(180));
            make.height.equalTo(FIT_WIDTH(102));
        }




        self.imageTopBtn.snp.makeConstraints { (make) in
            make.leftMargin.equalTo(FIT_WIDTH(300));
            make.topMargin.equalTo((FIT_WIDTH(100)));
            make.width.equalTo(FIT_WIDTH(102));
            make.height.equalTo(FIT_WIDTH(180));
        }


        self.imageBottomBtn.snp.makeConstraints { (make) in

            make.leftMargin.equalTo(FIT_WIDTH(300));
            make.topMargin.equalTo((FIT_WIDTH(500)));
            make.width.equalTo(FIT_WIDTH(102));
            make.height.equalTo(FIT_WIDTH(180));
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

/// 修正


import UIKit

enum LYUButtonLayoutStyle {
    case none
    case ImageLeftContentStart        /// 图片居左 文字居右 整体水平居左
    case ImageLeftContentCenter      /// 图片居左 文字配合间距 整体水平居中
    case ImageRightContentStart       /// 图片居右 文字配合间距 整体水平居右
    case ImageRightContentCenter    /// 图片局右 文字配合间距 整体水平居中
    case ImageTopContentCenter         /// 图片居上  文字配合间距 整体垂直方向居中
    case ImageBottomContentCenter   /// 图片居下 文字配合间距 整体垂直方向居中
}

class LYUContentLayoutBtn: UIButton {
   private(set) fileprivate var imgSize:CGSize = CGSize.zero;
   private(set) fileprivate var style:LYUButtonLayoutStyle = .none;
   private(set) fileprivate var space:CGFloat = 0.0;

    /// layout btn subviews
    ///
    /// - Parameters:
    ///   - style: layout style
    ///   - imgSize: img size
    ///   - space: space
    func layoutContent(style:LYUButtonLayoutStyle, imgSize:CGSize, space:CGFloat){
        self.style = style;
        self.imgSize = imgSize;
        self.space = space;
        /// 强制当前loop刷新UI
        setNeedsLayout();
        layoutIfNeeded();
    }


    override func layoutSubviews() {
        super.layoutSubviews();
        let size = self.bounds.size;
        switch self.style {
        case .none:

            break;
        case .ImageLeftContentStart:
            self.imageView?.frame = CGRect(x: 0, y: (size.height - self.imgSize.height)/2.0, width: self.imgSize.width, height: self.imgSize.height)
            let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: self.imgSize.width + self.space, y: 0, width: size.width - self.imgSize.width - self.space, height: size.height), limitedToNumberOfLines: self.titleLabel!.numberOfLines)
            self.titleLabel?.frame = CGRect(x: self.imgSize.width+self.space, y: (size.height - labRect.size.height)/2.0, width: size.width - self.imgSize.width - self.space, height: labRect.size.height)

            break;
        case .ImageLeftContentCenter:
            self.imageView?.frame = CGRect(x: 0, y: size.width/2.0 - self.imgSize.width - self.space/2.0, width: self.imgSize.width, height: self.imgSize.height);

            let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: self.imgSize.width + self.space, y: 0, width: size.width - self.imgSize.width - self.space/2.0, height: size.height), limitedToNumberOfLines: self.titleLabel!.numberOfLines)

            self.titleLabel?.frame = CGRect(x: size.width/2.0 + self.space/2.0, y: (size.height - labRect.size.height)/2.0, width: size.width - self.imgSize.width - self.space/2.0, height: labRect.size.height)

            break;
        case .ImageRightContentStart:
            self.imageView?.frame = CGRect(x: size.width - self.imgSize.width, y: (size.height - self.imgSize.height)/2.0, width: self.imgSize.width, height: self.imgSize.height)

             let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: 0, y: 0, width: size.width - self.imgSize.width - self.space, height: size.height), limitedToNumberOfLines: self.titleLabel!.numberOfLines)

            self.titleLabel?.frame = CGRect(x: 0, y: (size.height - labRect.size.height)/2.0, width: size.width - self.imgSize.width - self.space, height: labRect.size.height);

            break;
        case .ImageRightContentCenter:
              self.imageView?.frame = CGRect(x: size.width/2.0+self.space/2.0, y: (size.height - self.imgSize.height)/2.0, width: self.imgSize.width, height: self.imgSize.height)

             let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: 0, y: 0, width: size.width - self.imgSize.width - self.space, height: size.height), limitedToNumberOfLines: self.titleLabel!.numberOfLines)

              self.titleLabel?.frame = CGRect(x: 0, y: (size.height - labRect.size.height)/2.0, width: size.width - self.imgSize.width - self.space, height: labRect.size.height);

            break;

        case .ImageTopContentCenter:
             self.imageView?.frame = CGRect(x: size.width/2.0 - self.imgSize.width/2.0, y: size.height/2.0 - self.space/2.0 - self.imgSize.height, width: self.imgSize.width, height: self.imgSize.height)
               let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: 0, y: size.height/2.0+self.space/2.0, width: size.width , height: size.height/2.0 - self.space/2.0), limitedToNumberOfLines: self.titleLabel!.numberOfLines)
             self.titleLabel?.frame = CGRect(x: 0, y: size.height/2.0+self.space/2.0, width: size.width, height: labRect.size.height)
            break;
        case .ImageBottomContentCenter:
             self.imageView?.frame = CGRect(x: (size.width - self.imgSize.width)/2.0, y: size.height/2.0+self.space/2.0, width: self.imgSize.width, height: self.imgSize.height)

              let labRect = self.titleLabel!.textRect(forBounds: CGRect(x: 0, y:0, width: size.width , height: size.height/2.0 - self.space/2.0), limitedToNumberOfLines: self.titleLabel!.numberOfLines)

             self.titleLabel?.frame = CGRect(x: 0, y: size.height/2.0 - self.space/2.0 - labRect.size.height, width: size.width, height: labRect.size.height);
            break;
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值