最近用Swift4.0編寫了一個(gè)微信底部彈框,雖說(shuō)沒有什么大的技術(shù)含量,但通過(guò)這么一寫措嵌,發(fā)現(xiàn)了很多的問題。語(yǔ)法改動(dòng)較Swift3.0還是有那么一丟丟的芦缰。要追的知識(shí)點(diǎn)還是有些滴企巢!
通過(guò)一個(gè)小小的例子來(lái)重新熟悉了一下這些語(yǔ)法,因?yàn)楹芫脹]有用Swift編寫項(xiàng)目了让蕾,之前還是Swift2.0的時(shí)候?qū)戇^(guò)一個(gè)小項(xiàng)目浪规,當(dāng)然也是高仿人家的項(xiàng)目頁(yè)面。后期會(huì)用Swift4.0重寫以前的那些小項(xiàng)目探孝。盡情期待笋婿。。顿颅。
廢話不多說(shuō)缸濒,直接上代碼。粱腻。庇配。
//
// ActionSheetViewController.swift
// WeChatActionSheet
//
// Created by soliloquy on 2017/10/12.
// Copyright ? 2017年 soliloquy. All rights reserved.
//
import UIKit
public let kScreenWidth: CGFloat = UIScreen.main.bounds.size.width
public let kScreenHeight: CGFloat = UIScreen.main.bounds.size.height
class ActionSheetViewController: UIViewController {
// ----------------外界調(diào)用的屬性值--------------
var valueBlock: valueBlock?
/// cell內(nèi)容
var cellTitleList = [String]()
/// cell字體顏色
var cellTitleColor = UIColor.green
/// cell字體大小
var cellTitleFont: CGFloat = 17
/// 標(biāo)題
var titleString: String? = "我是一個(gè)標(biāo)題"
/// 標(biāo)題字體大小
var titleFont: CGFloat = 15
// ---------------內(nèi)部屬性-------------------
typealias valueBlock = (NSInteger)->Swift.Void
fileprivate var tableView = UITableView()
fileprivate var overVeiw = UIView()
fileprivate let cellID = "cellID"
fileprivate var tableViewHight: CGFloat {
return CGFloat(cellTitleList.count) * rowHight + headerViewHight + footerViewHight
}
fileprivate let rowHight: CGFloat = 50
fileprivate let headerViewHight: CGFloat = 50
fileprivate var footerViewLineHight: CGFloat = 5
fileprivate var footerViewHight: CGFloat {
return headerViewHight + footerViewLineHight
}
required init?(cellTitleList: [String]!) {
super.init(nibName: nil, bundle: nil)
// 初始化
self.cellTitleList = cellTitleList;
view.backgroundColor = UIColor.clear
self.providesPresentationContextTransitionStyle = true
self.definesPresentationContext = true
self.modalPresentationStyle = .custom
// 初始化UI
setupUIViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIView.animate(withDuration: 0.25) {
var frame = self.tableView.frame
frame.origin.y = kScreenHeight-self.tableViewHight
self.tableView.frame = frame
self.overVeiw.alpha = 0.5
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
// MARK: 初始化UI
extension ActionSheetViewController {
func setupUIViews() {
overVeiw =
UIView(frame: CGRect(x: 0, y: 0, width:kScreenWidth, height: kScreenHeight))
overVeiw.backgroundColor = UIColor.black
overVeiw.alpha = 0.0
view.addSubview(overVeiw)
tableView = UITableView(frame: CGRect(x: 0, y: kScreenHeight, width: kScreenWidth, height: tableViewHight), style: .plain)
overVeiw.addSubview(tableView)
tableView.delegate = self
tableView.dataSource = self
tableView.showsVerticalScrollIndicator = false
tableView.showsHorizontalScrollIndicator = false
tableView.isScrollEnabled = false
tableView.bounces = false
tableView.isPagingEnabled = false
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
tableView.register(TitleCell.classForCoder(), forCellReuseIdentifier: cellID)
}
}
// MARK: 點(diǎn)擊屏幕彈出退出
extension ActionSheetViewController {
func sheetViewDismiss() {
UIView.animate(withDuration: 0.25, animations: {
var frame = self.tableView.frame
frame.origin.y = kScreenHeight
self.tableView.frame = frame
self.overVeiw.alpha = 0
}) { (_) in
self.dismiss(animated: false, completion: nil)
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
sheetViewDismiss()
}
@objc func cancelBtnDidClick(btn: UIButton) {
sheetViewDismiss()
}
}
// MARK: UITableViewDelegate, UITableViewDataSource
extension ActionSheetViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cellTitleList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! TitleCell
cell.titleLabel.text = cellTitleList[indexPath.row]
cell.titleLabel.textColor = cellTitleColor
cell.titleLabel.font = UIFont.systemFont(ofSize: cellTitleFont)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return CGFloat(rowHight)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if (self.valueBlock != nil) {
self.valueBlock!(indexPath.row)
}
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return headerViewHight
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return headerViewHight + 5
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: headerViewHight))
// 標(biāo)題
let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: headerViewHight))
titleLabel.text = titleString
titleLabel.font = UIFont.systemFont(ofSize: titleFont)
titleLabel.textColor = UIColor.lightGray
titleLabel.textAlignment = .center
view.addSubview(titleLabel)
// 線
let lineView = UIView(frame: CGRect(x: 0, y: view.frame.size.height-1, width: kScreenWidth, height: 1))
lineView.backgroundColor = UIColor(red: 220/250.0, green: 220/250.0, blue: 220/250.0, alpha: 1.0)
view.addSubview(lineView)
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let footerView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: footerViewHight))
let lineView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: footerViewLineHight))
lineView.backgroundColor = UIColor.lightGray
footerView.addSubview(lineView)
let btn = UIButton(type: .custom)
btn.frame = CGRect(x: 0, y: footerViewLineHight, width: kScreenWidth, height: footerViewHight-footerViewLineHight)
footerView.addSubview(btn)
btn.setTitle("取消", for: .normal)
btn.titleLabel?.font = UIFont.systemFont(ofSize: titleFont)
btn.setTitleColor(UIColor.black, for: .normal)
btn.addTarget(self, action: #selector(cancelBtnDidClick(btn:)), for: .touchUpInside)
return footerView;
}
}
//
// TitleCell.swift
// WeChatActionSheet
//
// Created by soliloquy on 2017/10/13.
// Copyright ? 2017年 soliloquy. All rights reserved.
//
import UIKit
class TitleCell: UITableViewCell {
let titleLabel = UILabel()
override func awakeFromNib() {
super.awakeFromNib()
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
titleLabel.textAlignment = .center
addSubview(titleLabel)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
titleLabel.frame = self.bounds
}
}
先看效果。绍些。捞慌。。
用法:
點(diǎn)擊一個(gè)button, 彈窗底部效果
@IBAction func didClick(_ sender: UIButton) {
let acVC = ActionSheetViewController(cellTitleList: ["保存", "收藏", "分享", "點(diǎn)贊"])!
acVC.valueBlock = { index in
print(index)
}
acVC.cellTitleColor = UIColor.red
acVC.cellTitleFont = 17
acVC.titleString = "當(dāng)你彈出來(lái)時(shí)柬批,我love你"
present(acVC, animated: false, completion: nil)
}
以上就是封裝的一個(gè)仿微信底部彈框的例子啸澡。
GitHub地址:https://github.com/soliloquy-local/WeChatActionSheet
寫得不好希望大家指正,謝謝5省6亡!