Swift的日常一些笔记
一:弹出框的自定义View,一个空白的view层,通过调用弹出此类
1.类文件DateSelectView
import UIKit
class DateSelectView:UIView{
var commonView:UIView?
// var commonViewCloseBlock: (() -> Void)?
let ALERTVIEW_HEIGHT = UIScreen.main.bounds.size.height / 2.4
let ALERTVIEW_WIDTH = UIScreen.main.bounds.size.width - 50
init() {
let frame = CGRect(x: 0, y: 0,
width: screenWidth,
height: screenHeight)
super.init(frame: frame)
initView()
}
func initView(){
frame = UIScreen.main.bounds
commonView = UIView(frame: CGRect(x: 25, y: screenHeight / 2 - ALERTVIEW_HEIGHT / 2, width: ALERTVIEW_WIDTH, height: ALERTVIEW_HEIGHT))
commonView!.backgroundColor = UIColor.white
commonView!.layer.cornerRadius = 8.0
commonView!.layer.masksToBounds = true
commonView!.isUserInteractionEnabled = true
addSubview(commonView!)
showView()
}
func showView(){
backgroundColor = UIColor.clear
UIApplication.shared.keyWindow?.addSubview(self)
let transform: CGAffineTransform = CGAffineTransform(scaleX: 1.0,y: 1.0)
commonView!.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
commonView!.alpha = 0
UIView.animate(withDuration: 0.3, delay: 0.1, usingSpringWithDamping: 0.5, initialSpringVelocity: 10, options: .curveLinear, animations: {
self.backgroundColor = UIColor.black.withAlphaComponent(0.4)
self.commonView!.transform = transform
self.commonView!.alpha = 1
}) { finished in
}
}
func hideView() {
UIView.animate(withDuration: 0.5, animations: {
self.transform = self.transform.translatedBy(x: 0, y: -self.frame.maxY)
self.commonView!.alpha = 0
}) { isFinished in
self.commonView!.removeFromSuperview()
self.removeFromSuperview()
}
}
required init?(coder: NSCoder) {
fatalError("init code erro!!")
}
}
2.Controller文件
private var dateSelectView : DateSelectView?
dateSelectView = DateSelectView()
3.此时就可以通过按钮事件,或其他的事件,触发自定义view
4.添加按钮的事件,(确认,取消)
在view(DateSelectView)类文件添加
var sureBtn:UIButton?
var cancelBtn:UIButton?
//按钮视图栏目
sureBtn = UIButton()
sureBtn?.backgroundColor = UIColor(hexString: "#999999", transparency: 1.0)
sureBtn?.layer.cornerRadius = 15
sureBtn?.setTitle("确定", for: .normal)
commonView!.addSubview(sureBtn!)
sureBtn!.snp.makeConstraints{(make)->Void in
make.left.equalTo(commonView!).offset(10)
make.width.equalTo(commonView!).multipliedBy(0.4)
make.bottom.equalTo(commonView!).offset(-10)
make.height.equalTo(55)
}
cancelBtn = UIButton()
cancelBtn?.backgroundColor = UIColor(hexString: "#999999", transparency: 1.0)
cancelBtn?.layer.cornerRadius = 15
cancelBtn?.setTitle("取消", for: .normal)
commonView!.addSubview(cancelBtn!)
cancelBtn!.snp.makeConstraints{(make)->Void in
make.right.equalTo(commonView!).offset(-10)
make.width.equalTo(commonView!).multipliedBy(0.4)
make.bottom.equalTo(commonView!).offset(-10)
make.height.equalTo(55)
}
sureBtn!.addTarget(self, action: #selector(sureOnClick(sender:)), for: .touchUpInside)
cancelBtn!.addTarget(self, action: #selector(cancelOnClick(sender:)), for: .touchUpInside)
//view层的确认按钮
@objc func sureOnClick(sender:UIButton){
if sureBolck != nil{
sureBolck!(true)
}
hideView()
}
//view层的取消按钮
@objc func cancelOnClick(sender:UIButton){
hideView()
}
此时view弹出层的两个按钮可以实行点击了,并且视图层view会进行隐藏消失
再继续添加按钮事件到controller文件,从而可以在控制器界面进行调用
- view弹出层
typealias sureBtnClick = (_ select:Bool) -> Void
class DateSelectView:UIView{
var sureBolck:sureBtnClick?
//controller层的按钮方法调用
func clickSureBtn(_ block: @escaping sureBtnClick) {
sureBolck = block
}
}
- controller层
dateSelectView?.clickSureBtn({_ in
print("dd")
})
//此时点击确定按钮,能输出数据到controller文件
二:UITextField的一些属性
let textField = UITextField()
textField.keyboardType = .numberPad//键盘只能输入数字
三:日期的一些常用代码
1.打印出日期:如2023-5-20
let date = Date() // 获取当前日期
let dateFormatter = DateFormatter() // 初始化日期格式化器
dateFormatter.dateFormat = "yyyy-MM-dd" // 设置日期格式
let dateString = dateFormatter.string(from: date) // 将日期转化为字符串
print(dateString) // 打印日期字符串
其中,Date表示当前的日期时间,DateFormatter用于将日期格式化为指定的字符串格式。在上面的代码中,我们首先通过Date()获取当前的日期时间,然后创建一个DateFormatter并设置其日期格式为"yyyy-MM-dd",最后通过string(from:)方法将日期转化为指定格式的字符串。
需要注意的是,上面的代码中打印的日期字符串只包含年月日,不包含具体的时间信息。如果需要包含时间信息,可以将日期格式设置为"yyyy-MM-dd HH:mm:ss"等格式。
四:UIScrollView
1.UIScrollView如何设置圆角
lfAddView?.showsHorizontalScrollIndicator = false // 隐藏横向滚动条
lfAddView?.showsVerticalScrollIndicator = false // 隐藏纵向滚动条
lfAddView?.backgroundColor = UIColor.clear // 设置为透明色
lfAddView?.layer.cornerRadius = 10 // 设置圆角半径
lfAddView?.layer.masksToBounds = true // 裁剪超出圆角范围的部分
五:弹窗封装
1.确认+取消
在一个公共类中添加这个方法
//弹窗(确认-取消)
func showAlert(from viewController: UIViewController, title: String, message: String, okHandler: @escaping () -> Void) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
let okAction = UIAlertAction(title: "确定", style: .destructive, handler: { action in
okHandler()
})
alert.addAction(cancelAction)
alert.addAction(okAction)
viewController.present(alert, animated: true, completion: nil)
}
2.在controller控制层界面调用方法
AlertHelper.showAlert(from: self, title: "确认删除", message: "确定要删除这条记录吗?") {
// 执行删除操作
let id = lfClientArrayList[indexPath.row].id!
let idString = "\(id)"
lfClientPresenter.deleteDataListJson(id:idString , userId: userId!, token: auth!)
lfClientArrayList.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
六:界面点击输入框外的区域实现隐藏键盘(封装)
1.公共类中添加此方法
class KeyboardHelper {
static func addTapGestureToHideKeyboard(to view: UIView) {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
view.addGestureRecognizer(tapGesture)
}
@objc static func handleTap(_ gesture: UITapGestureRecognizer) {
gesture.view?.endEditing(true)
}
}
2.在任意controller控制层进行调用
override func viewDidLoad() {
super.viewDidLoad()
KeyboardHelper.addTapGestureToHideKeyboard(to: view)
}
七:列表向左滑动删除的功能
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
allExpanded.showAlert(from: self, title: "确认删除", message: "确定要删除这条记录吗?") { [self] in
// 执行删除操作
let id = lfClientArrayList[indexPath.row].id!
let idString = "\(id)"
lfClientPresenter.deleteDataListJson(id:idString , userId: userId!, token: auth!)
lfClientArrayList.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
}
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "删除"
}
八:动态定义多数据添加界面布局
1.view
import UIKit
protocol LFClientAddViewDelegate:NSObjectProtocol{
func onlfAddDateLick(_ sender: UIButton, text: String, tag: Int)
}
class LFClientAddView:BaseView{
weak var delegate:LFClientAddViewDelegate?
let data = ["客户名称", "客户类型","联系人","联系电话","访问结果","访问次数","日期","经办人","经办日期","备注"]
var addview:UIView?
var lfAddView:UIScrollView?
var kName:UITextField?
var khType:UITextField?
var lxname:UITextField?
var lxpw:UITextField?
var lfjg:UITextField?
var lfno:UITextField?
var lfdate:UIButton?
var aname:UITextField?
var adate:UIButton?
var remark:UITextField?
override func initView() {
super.initView()
addview = UIView()
addview?.backgroundColor = UIColor(hexString: "#F5F5F5", transparency: 1.0)
self.addSubview(addview!)
addview!.snp.makeConstraints { make in
make.top.equalTo(self).offset(0)
make.bottom.equalTo(self).offset(0)
make.left.equalTo(self).offset(0)
make.right.equalTo(self).offset(0)
}
lfAddView = UIScrollView()
lfAddView?.backgroundColor = UIColor.white
lfAddView?.showsHorizontalScrollIndicator = false // 隐藏横向滚动条
lfAddView?.showsVerticalScrollIndicator = false // 隐藏纵向滚动条
lfAddView?.layer.cornerRadius = 10 // 设置圆角半径
lfAddView?.layer.masksToBounds = true // 裁剪超出圆角范围的部分
addview!.addSubview(lfAddView!)
lfAddView?.snp.makeConstraints({ make in
make.top.equalTo(self).offset(70)
make.bottom.equalTo(self).offset(-10)
make.left.equalTo(self).offset(10)
make.right.equalTo(self).offset(-10)
})
var offset = 10 // 初始偏移量
//开始循环数据列表
for (index, item) in data.enumerated() {
//标题label
let kNameLb = UILabel()
kNameLb.text = item
kNameLb.textColor = UIColor(hexString: LF_CLIENT_KHZL_ITEM_TITLE, transparency: 1.0)
kNameLb.font = UIFont(name: "", size: 22)
lfAddView?.addSubview(kNameLb)
kNameLb.snp.makeConstraints { make in
make.top.equalTo(lfAddView!).offset(offset)
make.width.equalTo(screenWidth)
make.height.equalTo(23)
}
//输入框
let textField = UITextField()
textField.placeholder = "请输入\(item)"
textField.returnKeyType = .done
textField.tag = index // 设置tag值
lfAddView?.addSubview(textField)
textField.snp.makeConstraints({ make in
make.top.equalTo(kNameLb).offset(30)
make.width.equalTo(screenWidth-20)
make.height.equalTo(39)
})
//按钮
let uiButton = UIButton()
uiButton.tag = index
uiButton.setTitleColor(UIColor.black, for: .normal)
uiButton.titleLabel?.font = UIFont.systemFont(ofSize: 15)
uiButton.addTarget(self, action: #selector(onLfdateClick(sender:)), for: .touchUpInside)
lfAddView?.addSubview(uiButton)
uiButton.snp.makeConstraints({ make in
make.top.equalTo(kNameLb).offset(30)
make.width.equalTo(screenWidth)
make.height.equalTo(39)
})
//横线
let mUserpwd = UIView()
mUserpwd.backgroundColor = UIColor(hexString: "#e0e0e0", transparency: 1.0)
lfAddView!.addSubview(mUserpwd)
mUserpwd.snp.makeConstraints { make in
make.top.equalTo(textField).offset(41)
make.width.equalTo(screenWidth)
make.height.equalTo(1)
}
//通过textField.tag定义的index来判断展示的UI
if index == 0 {
uiButton.isHidden = true
kName = textField
} else if index == 1 {
uiButton.isHidden = true
khType = textField
} else if index == 2 {
uiButton.isHidden = true
lxname = textField
}else if index == 3{
uiButton.isHidden = true
textField.keyboardType = .numberPad
lxpw = textField
}else if index == 4{
uiButton.isHidden = true
lfjg = textField
}else if index == 5{
uiButton.isHidden = true
textField.keyboardType = .numberPad
lfno = textField
}else if index == 6{
textField.isHidden = true
lfdate = uiButton
}else if index == 7{
uiButton.isHidden = true
aname = textField
}else if index == 8{
textField.isHidden = true
adate = uiButton
}else if index == 9{
uiButton.isHidden = true
remark = textField
}
offset += 80 // 增加偏移量
}
// 设置UIScrollView的滚动范围
lfAddView!.contentSize = CGSize(width: lfAddView!.bounds.width, height: 900)
}
@objc func onLfdateClick(sender: UIButton) {
// 按钮点击事件
let buttonText = sender.currentTitle ?? ""
// 获取tag值
let tag = sender.tag
// 可以在这里处理代理回调等逻辑
if let delegate = delegate {
delegate.onlfAddDateLick(sender, text: buttonText, tag: tag)
}
}
}
2.LFClientAddController
class LFClientAddController:NavigationController,NavigationRightDelegate,LFClientAddProtocol,LFClientAddViewDelegate,UITextFieldDelegate{
var addview: LFClientAddView!
override func initView() {
super.initView()
//let view = UIView()
addview = LFClientAddView(frame: view.bounds)
addview.delegate = self
delegate = self
addview.kName?.delegate = self
addview.khType?.delegate = self
addview.lxname?.delegate = self
addview.lxpw?.delegate = self
addview.lfjg?.delegate = self
addview.lfno?.delegate = self
addview.aname?.delegate = self
addview.remark?.delegate = self
view.addSubview(addview)
}
}
九:UITextField和UITextView的键盘回收
1.方法的代码
//UITextField的键盘回收
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
//textView键盘按下return回收事件
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
return false // 这里返回false,代表按下return键不会产生换行,同时隐藏键盘
}
return true
}
2.实现代理
class LFClientListItemController:NavigationController,UITextFieldDelegate,UITextViewDelegate{
override func initView() {
super.initView()
lfListItemView.delegate = self
lfListItemView.remark?.delegate = self // 设置代理
}
}