Swift封装一套类似于微信右上角弹出框(PopView)

                        

 

//这个图片需要导入进工程中 - 名字为"popTop" 如果改变这个图片需要到HKPopView.swift中改变这个图片的名字

 

  • 封装一个Control控件 - 作为每一个cell单元
//
//  HKPopControl.swift
//  HKSwiftDemo
//
//  Created by isHakan on 2018/1/31.
//  Copyright © 2018年 liuhuakun. All rights reserved.
//

import UIKit

class HKPopControl: UIControl {
    
    init(frame: CGRect, imageName:String, title:String, hiddenLine:Bool) {
        super.init(frame: frame)
        self.frame = frame
        self.backgroundColor = UIColor.init(red: 65/255.0, green: 65/255.0, blue: 65/255.0, alpha: 1)
        
        let w = frame.size.width
        let h = frame.size.height
        let imageView_x:CGFloat = 8.0
        let imageView_y:CGFloat = 4.0
        let imageView_h = h - 2*imageView_y
        let imageView_w = imageView_h
        var imageView_rect = CGRect.init()
        imageView_rect.origin.x = imageView_x
        imageView_rect.origin.y = imageView_y
        imageView_rect.size.width = imageView_w
        imageView_rect.size.height = imageView_h
        
        let imageView = UIImageView.init(frame: imageView_rect)
        imageView.image = UIImage.init(named: imageName)
        self.addSubview(imageView)
        
        let label_x = imageView.frame.maxX + 8.0
        let label_y = imageView_y
        let label_h = imageView_h
        let label_w = w-label_x
        var label_rect = CGRect.init()
        label_rect.origin.x = label_x
        label_rect.origin.y = label_y
        label_rect.size.width = label_w
        label_rect.size.height = label_h
        
        let titleLabel = UILabel.init(frame: label_rect)
        titleLabel.text = title
        titleLabel.textColor = UIColor.white
        titleLabel.adjustsFontSizeToFitWidth = true
        titleLabel.font = UIFont.systemFont(ofSize: 14.0)
        self.addSubview(titleLabel)
        
        let line_x = imageView_x
        let line_y = h - 1.0
        let line_w = w - 2*line_x
        let line_h:CGFloat = 1.0
        var line_rect = CGRect.init()
        line_rect.origin.x = line_x
        line_rect.origin.y = line_y
        line_rect.size.width = line_w
        line_rect.size.height = line_h
        let lineLable = UILabel.init(frame: line_rect)
        lineLable.backgroundColor = UIColor.gray
        lineLable.isHidden = hiddenLine
        self.addSubview(lineLable)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

 

  • 封装一个弹出框view(popView)
//
//  HKPopView.swift
//  HKSwiftDemo
//
//  Created by isHakan on 2018/1/31.
//  Copyright © 2018年 liuhuakun. All rights reserved.
//

import UIKit

protocol HKPopCtrlCellClickDelegate:NSObjectProtocol {
    func popCtrlCellClick(tag:Int)
}

class HKPopView: UIView {

    //代理
    var delegate:HKPopCtrlCellClickDelegate?
    
    /// MARK - frame为弹出popView一个cell的frame
    init(frame: CGRect, imageNameArr:[String], titleArr:[String]) {
        super.init(frame: UIScreen.main.bounds)
        
        //整个屏幕背景
        self.frame = UIScreen.main.bounds
        self.backgroundColor = UIColor.black.withAlphaComponent(0.1)
        
        //凸起的小角
        let small_w:CGFloat = 10.0
        let small_h:CGFloat = 6.0
        let small_y = frame.origin.y - small_h
        
        var ww:CGFloat
        
        if UIScreen.main.bounds.size.width == 414.0 {//iphone plus
            ww = 15.0
        }else {
            ww = 12.0
        }
        
        let small_x = UIScreen.main.bounds.size.width - 8 - ww - small_w
        var small_rect = CGRect.init()
        small_rect.origin.x = small_x
        small_rect.origin.y = small_y
        small_rect.size.width = small_w
        small_rect.size.height = small_h
        let smallImageView = UIImageView.init(frame: small_rect)
        smallImageView.image = UIImage.init(named: "popTop")
        self.addSubview(smallImageView)
        
        let popCtrl_w = frame.size.width
        let popCtrl_h = frame.size.height
        let popCtrl_x = frame.origin.x
        
        for index in 0..<imageNameArr.count {
            let popCtrl_y = frame.origin.y + CGFloat(index) * popCtrl_h
            
            var popCtrl_rect = CGRect.init()
            popCtrl_rect.origin.x = popCtrl_x
            popCtrl_rect.origin.y = popCtrl_y
            popCtrl_rect.size.width = popCtrl_w
            popCtrl_rect.size.height = popCtrl_h
            
            var isLastCell:Bool = false
            ///最后一个cell隐藏底部line
            if index == imageNameArr.count-1 {
                isLastCell = true
            }
            
            let popCtrl = HKPopControl.init(frame: popCtrl_rect, imageName: imageNameArr[index], title: titleArr[index], hiddenLine:isLastCell)
            
            popCtrl.tag = 1000+index
            popCtrl.addTarget(self, action: #selector(popCtrlClick), for: .touchUpInside)
            self.addSubview(popCtrl)
        }
        
        UIApplication.shared.keyWindow?.addSubview(self)
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        UIView.animate(withDuration: 0.25, animations: {
            self.alpha = 0
        }) { (view) in
            self.removeFromSuperview()
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        UIView.animate(withDuration: 0.25, animations: {
            self.alpha = 0
        }) { (view) in
            self.removeFromSuperview()
        }
    }
    
    
    @objc func popCtrlClick(popCtrl:HKPopControl) {
        guard delegate == nil else {
            delegate?.popCtrlCellClick(tag: popCtrl.tag)
            UIView.animate(withDuration: 0.25, animations: {
                self.alpha = 0
            }, completion: { (view) in
                self.removeFromSuperview()
            })
            return
        }
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

 

  • 在需要的界面使用起来
//
//  HKUIImageViewViewController.swift
//  HKSwiftDemo
//
//  Created by isHakan on 2018/1/26.
//  Copyright © 2018年 liuhuakun. All rights reserved.
//

import UIKit
                                                        //遵守HKPopView.swift代理
class HKUIImageViewViewController: HKBaseViewController,HKPopCtrlCellClickDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let barBtnItem = UIBarButtonItem.init(barButtonSystemItem: .add, target: self, action: #selector(barBtnItemClick))
        self.navigationItem.rightBarButtonItem = barBtnItem
    }

    
    @objc func barBtnItemClick(barBtnItem:UIBarButtonItem) {
        
        //设置每一个弹出cell的大小跟坐标 - frmae
        let popViewCell_w = UIScreen.main.bounds.size.width/3.0
        let popViewCell_h:CGFloat = 35.0
        let popViewCell_x = UIScreen.main.bounds.size.width*2/3.0 - 8.0
        let popViewCell_y:CGFloat = self.NAVIGATIONBAR_H! + 8.0//self.NAVIGATIONBAR_H!是tableBar的高度 iPhone X为88.0,其他的为64.0
        
        var popViewCell_rect = CGRect.init()
        popViewCell_rect.origin.x = popViewCell_x
        popViewCell_rect.origin.y = popViewCell_y
        popViewCell_rect.size.width = popViewCell_w
        popViewCell_rect.size.height = popViewCell_h
        
        //图片数组名
        let imageNameArr = ["1","1","1","1"]
        //label显示标题名
        let titleArr = ["发起群聊","添加朋友","扫一扫","收付款"]
        
        let popView = HKPopView.init(frame: popViewCell_rect, imageNameArr: imageNameArr, titleArr: titleArr)
        popView.delegate = self
    }
    
    ///点击popCtrlCell代理传回ViewController
    func popCtrlCellClick(tag:Int) {
        print("点击的是:\(tag)")
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

 

转载于:https://www.cnblogs.com/liuhuakun/p/8392174.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值