iOS 根据给定高度自适应文字大小并有序排列,类似历史搜索界面的文字排列

效果图如下:
在这里插入图片描述
效果图如下:
在这里插入图片描述
1.直接上代码

      
     //buttonContentView:将按钮要添加的view 
     //is_showMore:是否展示更多
     func addTitleLabel(titleArray:[[String:Any]]){
        for btn in buttonContentView.subviews{
            btn.removeFromSuperview()//先移除所有子控件
        }
        let space = 15.0 //item间隙
        var tempLength = 0.0 //记录一行的长度
        var line = 0.0 //行数
        let viewH = 30.0 //item高度
        for (index,text) in titleArray.enumerated(){
            let btn = UIButton()
            btn.backgroundColor = UIColor.init(hexString: "#F1F1F1")
            btn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
            btn.setTitleColor(UIColor.init(hexString: "#222222 "), for: .normal)
            btn.setTitle(text, for: .normal)
            let  viewX = tempLength + space
            let  viewW = String.textWidth(text: text)
            let viewY = line * (viewH + space) + space
            btn.frame = CGRect.init(x: viewX, y: viewY, width: viewW, height: viewH)
            btn.layer.cornerRadius = 15 //圆角
            btn.tag = index + 666 //赋值
            buttonContentView.addSubview(btn)
            //这里是对大于两行的默认只展示两行,点击向下箭头会展示更多 
            if line < 2{
                btn.isHidden = false
            }else{
                if is_showMore  {
                    btn.isHidden = false
                }else{ //大于两行 并且 没有展开更多 就隐藏按钮
                    btn.isHidden = true
                }
            }
            btn.addTarget(self, action: #selector(btnClickAction(_:)), for: .touchUpInside)
            if index < (titleArray.count - 1){
                let nextViewX = viewX + viewW + space
                let nextText =  titleArray[index + 1]
                let nextViewW = String.textWidth(text: nextText)
                if  (nextViewX + nextViewW + space) < (kScreenWidth - 2 * space){
                    tempLength = viewX + viewW
                }else{
                    tempLength = 0.0
                    line = line + 1.0//加一行
                }
            }
         }
    }
    //点击文字按钮的事件处理
    @objc func btnClickAction(_ btn:UIButton){
        let btnIndex = btn.tag  - 666
        let text = datalist[btnIndex]
        
        if block != nil{
            block!(text)
        }
    }

2.根据文字计算宽度的方法我写在了String的扩展里了,代码如下:

extension String {
    //MARK: 计算文字宽度(搜索界面使用)
    static func textWidth(text:String) -> CGFloat {
        let length = text.boundingRect(with:CGSize(width:CGFloat(kScreenWidth - 30), height: 30), options: .usesLineFragmentOrigin, attributes: [.font:UIFont.systemFont(ofSize: 15)], context:nil).size.width + 30
        if length >= CGFloat(kScreenWidth - 30){
            return CGFloat(kScreenWidth - 30)
        }else{
            return length
        }
    }
  
 }

End

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值