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 // 设置代理

}
}

十:密码输入框上面的显示与隐藏

1.LoginView界面

protocol LoginViewProtocol:NSObjectProtocol {
   func togglePasswordVisibility()
}
class LoginView: BaseView {
weak var delegate:LoginViewProtocol?
var mPwdTf:UITextField?
var eyeButton: UIButton!
override func initView() {
       let passwordView = UIView()
       passwordView.layer.cornerRadius = 8
       passwordView.layer.borderColor = UIColor.gray.cgColor
       passwordView.layer.borderWidth = 1
       middleView.addSubview(passwordView)
       
       passwordView.snp.makeConstraints{(make)->Void in
           make.left.equalTo(middleView).offset(10)
           make.right.equalTo(middleView).offset(-10)
           make.top.equalTo(middleView).offset(85)
           make.height.equalTo(50)
       }

	//输入框
	mPwdTf = UITextField()
       mPwdTf?.placeholder = "Please input password."
       mPwdTf?.text=""
       mPwdTf?.isSecureTextEntry = true
       mPwdTf?.textColor = UIColor.lightGray
       passwordView.addSubview(mPwdTf!)
       
       mPwdTf?.snp.makeConstraints{(make)->Void in
           make.left.equalTo(mPwdIv!).offset(35)
           make.width.equalTo(220)
           make.top.equalTo(passwordView).offset(0)
           make.height.equalTo(50)
       }

//隐藏密码与显示密码的眼睛图片
// 添加眼睛图标按钮
       eyeButton = UIButton(type: .custom)
       eyeButton.setImage(UIImage(named: "user"), for: .normal)
       eyeButton.imageEdgeInsets = UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12) // 调整图标位置
       eyeButton.addTarget(self, action: #selector(togglePasswordVisibility), for: .touchUpInside)
       passwordView.addSubview(eyeButton)
       
       eyeButton.snp.makeConstraints { (make) in
           make.right.equalToSuperview().offset(-10) // 右边距离父视图
           make.centerY.equalTo(self.mPwdTf!) // 垂直居中于密码输入框
           make.width.height.equalTo(60) // 固定按钮大小
       }
}
//代理
 @objc func togglePasswordVisibility() {
       if delegate != nil {
           delegate!.togglePasswordVisibility()
       }
   }
}

2.controller界面

 private var loginView = LoginView()
extension LoginViewController: LoginViewProtocol{
   //显示与隐藏密码
    func togglePasswordVisibility() {
        loginView.mPwdTf!.isSecureTextEntry.toggle()
        let imageName = loginView.mPwdTf!.isSecureTextEntry ? "user" : "pwd"
        loginView.eyeButton.setImage(UIImage(named: imageName), for: .normal)
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值