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

时间:2022-09-19 14:17:23

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

 

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.
}
*/

}