美文网首页
Swift 基础控件

Swift 基础控件

作者: jiangzz | 来源:发表于2021-02-25 17:21 被阅读0次

    UIImageView、UITableView、UICollectionView、UIButton、导航栏、UIView

    UIImageView -###

    1.图片类UIImage

    //通过图片名称创建UIImage实例
    let image = UIImage(named: "imageName")
    //通过文件路径创建UIImage实例
    let image = UIImage(contentsOfFile: "filePath")
    //通过Data数据创建UIImage实例
    let image = UIImage(data: Data())
    

    2.使用UIImageView展示图片

    let imageView = UIImageView(frame: CGRectMake(10.0, 10.0, 100.0, 100.0))
    let image = UIImage(named: "imageName")
    imageView.image = image
    self.view.addSubview(imageView)
    

    3.使用UIImageView播放动画

    //创建一个图片数组
    var images:Array<UIImage> = []
    for i in 0 ..< 17 {
       let image = UIImage(named: "qq\(i)")
       images.append(image!)
    }
    let imageView = UIImageView(frame: self.view.frame)
    //设置图像视图的动画图片属性
    imageView.animationImages = images
    //设置帧动画的时长为五秒
    imageView.animationDuration = 1.6
    //设置动画循环次数,0为无限播放
    imageView.animationRepeatCount = 1
    //开始动画的播放
    imageView.startAnimating()
    self.view.addSubview(imageView)
    
    UITableView -###

    1.懒加载

    lazy var catalogue : UITableView = {
       let catalogue = UITableView()
       catalogue.delegate = self;
       catalogue.dataSource = self;
       catalogue.tableFooterView = UIView(frame:CGRect.zero)//除去多余的cell
       catalogue.autoresizingMask = .flexibleWidth
       catalogue.register(UITableViewCell.self, forCellReuseIdentifier: "NationalityListView")//非xib cell 注册
       catalogue.register(UINib(nibName: "CatalogueTableViewCell", bundle: nil), forCellReuseIdentifier: "CatalogueTableViewCell")//xib cell 注册
       //分割线样式
       catalogue.separatorInset = UIEdgeInsets.zero;
       catalogue.layoutMargins = UIEdgeInsets.zero;
       ///索引需要的设置
       // 设置索引值颜色
       catalogue.sectionIndexColor = UIColor.gray
       // 设置选中时的索引背景颜色
       catalogue.sectionIndexTrackingBackgroundColor = UIColor.colorWithHex(hexColor: 0xf2f2f2)
       // 设置索引的背景颜色
       catalogue.sectionIndexBackgroundColor = UIColor.colorWithHex(hexColor: 0xf2f2f2)
       
       return catalogue
    }()
    

    2.TableView cell 注册/使用

    //xib
    self.tableView.register(UINib(nibName:"SystemSettingCell", bundle:nil),
           forCellReuseIdentifier:"SystemSettingCell")//注册
    let cell = tableView.dequeueReusableCell(withIdentifier: "SystemSettingCell", for: indexPath) as! SystemSettingCell//使用
    
    //不重用 cell数量多,消耗内存严重
    let docData = self.doclist[self.typeList[indexPath.section]]![indexPath.row]
    let identifier = "\(docData.docPath)\(indexPath.row)"
    self.tableView!.register(UINib(nibName:"didDownloadCell", bundle:nil),
                            forCellReuseIdentifier:identifier)
    let cell = tableView.dequeueReusableCell(withIdentifier:identifier)
    as! didDownloadCell
    
    //非xib
    self.tableView.register(noticeTableViewCell.self, forCellReuseIdentifier: "SwiftCell")//注册
    let cell:noticeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "SwiftCell") as! noticeTableViewCell//使用
    

    3.原生实现TableView索引

    • 实现后tableview与父视图间会出现间距 用以显示索引
    //实现索引数据源代理方法
    func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return adHeaders
    }
    //点击索引,移动TableView的组位置
    func tableView(_ tableView: UITableView,
                       sectionForSectionIndexTitle title: String, at index: Int) -> Int {
        var tpIndex:Int = 0
            //遍历索引值
            for character in titleData{
                //判断索引值和组名称相等,返回组坐标
                if character == title{
                    return tpIndex
                }
                tpIndex += 1
            }
        return 0
    }
    

    4.TableViewCell 左滑操作

    • 单个操作按钮
    //在这里修改删除按钮的文字
    func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
        return "移除"
    }
    //点击删除按钮的响应方法
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        let alertController = UIAlertController(title: "提示",
                                                message:"是否删除?", preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
        let okAction = UIAlertAction(title: "确定", style: .default, handler: {
            action in
            self.deleteStu(indexPath)
        })
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)
    }
    func deleteStu(_ indexPath:IndexPath){
    }
    
    • 多个操作按钮
    @available(iOS 11.0, *)
    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let deleteAction = UIContextualAction(style: .normal, title: "") { [weak self] (action, view, resultClosure) in
            guard self != nil else {
                return
            }
            // TODO
        }
        let shareAction = UIContextualAction(style: .normal, title: "") { [weak self] (action, view, resultClosure) in
            guard self != nil else {
                return
            }
            // TODO
        }
        deleteAction.backgroundColor = .red
        shareAction.backgroundColor = .yellow
        let actions = UISwipeActionsConfiguration(actions: [deleteAction, shareAction])
        actions.performsFirstActionWithFullSwipe = false; // 禁止侧滑到最左边触发删除或者分享回调事件
        return actions
    }
    //  适配iOS 11.0之后 修改侧滑删除、分享按钮
    func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {
        if #available(iOS 11.0, *) {
            for subView in tableView.subviews {
                if NSStringFromClass(subView.classForCoder) == "UISwipeActionPullView" {
                    
                    if let deleteBtn: UIButton = subView.subviews.last as? UIButton  {
                        changeAction(sourceBtn: deleteBtn, title: "取消收藏", imageStr: "icon_collecton_delete")
                    }
                    if let shareBtn: UIButton = subView.subviews.first as? UIButton  {
                        changeAction(sourceBtn: shareBtn, title: "分享", imageStr: "icon_collecton_share")
                    }
                    
                }else if NSStringFromClass(subView.classForCoder) == "_UITableViewCellSwipeContainerView" {
                    
                    // iOS13.0之后
                    for sub in subView.subviews {
                        if NSStringFromClass(sub.classForCoder) == "UISwipeActionPullView" {
                            if let deleteBtn: UIButton = sub.subviews.last as? UIButton  {
                                changeAction(sourceBtn: deleteBtn, title: "取消收藏", imageStr: "icon_collecton_delete")
                            }
                            if let shareBtn: UIButton = sub.subviews.first as? UIButton  {
                                changeAction(sourceBtn: shareBtn, title: "分享", imageStr: "icon_collecton_share")
                            }
                        }
                    }
                    
                }
            }
        }
    }
    func changeAction(sourceBtn: UIButton, title: String?, imageStr: String?) {
        let btn = UIButton(type: .custom)
        btn.frame = CGRect(x: 0, y: 0, width: sourceBtn.frame.width, height: sourceBtn.frame.height)
        btn.backgroundColor = sourceBtn.backgroundColor
        btn.setImage(UIImage(named: imageStr ?? ""), for: .normal)
        btn.setTitle(title, for: .normal)
        btn.setTitleColor(UIColor.white, for: .normal)
        btn.titleLabel?.font = UIFont.init(name: "PingFang-SC-Medium", size: 14)
        if #available(iOS 13.0, *) {
            btn.titleLabel?.font = UIFont.init(name: "PingFang-SC-Medium", size: 13)
        } else {
            btn.contentHorizontalAlignment = .left
        }
      // 修改button的图文上下显示
        btn.Jzz_setButtonStyle(buttonMode: .Top, spacing: 1)
        btn.isUserInteractionEnabled = false
        sourceBtn.backgroundColor = .clear
        sourceBtn.addSubview(btn)
    }
    
    UICollectionView -###

    1.懒加载

    private lazy var collectionView: UICollectionView = {
       let layout = UICollectionViewFlowLayout()
       layout.itemSize = bounds.size
       //滚动方向
       layout.scrollDirection = .horizontal
       // 1.设置 最小行间距
       layout.minimumLineSpacing = 20;
       // 2.设置 最小列间距
       layout. minimumInteritemSpacing  = 10;
       // 3.设置item块的大小 (可以用于自适应)
       layout.estimatedItemSize = CGSizeMake(20, 60);
       //item内边距
       layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
       
       let collectionView = UICollectionView(frame: bounds, collectionViewLayout: layout)
       collectionView.backgroundColor = .clear
       //不显示滚动条
       collectionView.showsHorizontalScrollIndicator = false
       collectionView.showsVerticalScrollIndicator = false
       //类似分页效果
       collectionView.isPagingEnabled = true
       collectionView.delegate = self
       collectionView.dataSource = self
       collectionView.register(ICycleViewCell.self, forCellWithReuseIdentifier: ICycleViewConst.cellIdentifier)//非 xib cell 注册
       collectionView.register(UINib.init(nibName: "moocHeadImgCell", bundle: Bundle.main), forCellWithReuseIdentifier: "moocHeadImgCell")// xib cell 注册
       //注册头尾视图
       collectView.register(SwiftFooterCollectionReusableView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "SwiftFooterCollectionReusableView")//非 xib cell 注册
       collectionStuAnswer.register(UINib.init(nibName: "stuAnswerSectionHeader", bundle: Bundle.main), forSupplementaryViewOfKind:
               UICollectionElementKindSectionHeader, withReuseIdentifier: "stuAnswerSectionHeader")xib cell 注册
       return collectionView
    }()
    

    2.UICollectionViewCell 注册使用

    //xib
    self.collectionView.register(UINib.init(nibName: "ZQUICollectionViewCell_Img", bundle: nil), forCellWithReuseIdentifier: "ZQUICollectionViewCell_Img")
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ZQUICollectionViewCell_Img", for: indexPath) as! ZQUICollectionViewCell_Img
    //非xib
    collectionView.register(TalnetImageShareCell.self, forCellWithReuseIdentifier: "cell")
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",
    for: indexPath) as! TalnetImageShareCell
    

    3.UICollectionView 头尾视图

    //设置 区头和区尾 
    func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
       if kind == UICollectionView.elementKindSectionHeader  {
           let headerView:SwiftHeaderCollectionReusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "SwiftHeaderCollectionReusableView", for: indexPath) as! SwiftHeaderCollectionReusableView
           return headerView
       }else{
           let footerView:SwiftFooterCollectionReusableView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "SwiftFooterCollectionReusableView", for: indexPath) as! SwiftFooterCollectionReusableView
           return footerView
       }
    }
    
    UIButton-###

    1.文字和图片共存

    • 添加category,UIButton + Extension
    enum JZZButtonMode {
       case Top
       case Bottom
       case Left
       case Right
    }
    import UIKit
    
    extension UIButton {
    
       /// 快速调整图片与文字位置
       ///
       /// - Parameters:
       ///   - buttonMode: 图片所在位置
       ///   - spacing: 文字和图片之间的间距
       func Jzz_setButtonStyle(buttonMode: JZZButtonMode,
                                                spacing: CGFloat) {
           let imageSize = self.imageRect(forContentRect: self.frame)
           let titleFont = self.titleLabel?.font!
           let titleSize = titleLabel?.text?.size(withAttributes: [kCTFontAttributeName as NSAttributedString.Key: titleFont!]) ?? CGSize.zero
           var titleInsets: UIEdgeInsets
           var imageInsets: UIEdgeInsets
           switch (buttonMode){
           case .Top:
               titleInsets = UIEdgeInsets(top: (imageSize.height + titleSize.height + spacing)/2,
                                          left: -(imageSize.width), bottom: 0, right: 0)
               imageInsets = UIEdgeInsets(top: -(imageSize.height + titleSize.height + spacing)/2, left: 0, bottom: 0, right: -titleSize.width)
           case .Bottom:
               titleInsets = UIEdgeInsets(top: -(imageSize.height + titleSize.height + spacing)/2,
                                          left: -(imageSize.width), bottom: 0, right: 0)
               imageInsets = UIEdgeInsets(top: (imageSize.height + titleSize.height + spacing)/2, left: 0, bottom: 0, right: -titleSize.width)
           case .Left:
               titleInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: -spacing)
               imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
           case .Right:
               titleInsets = UIEdgeInsets(top: 0, left: -(imageSize.width * 2), bottom: 0, right: 0)
               imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0,
                                          right: -(titleSize.width * 2 + spacing))
           }
           self.titleEdgeInsets = titleInsets
           self.imageEdgeInsets = imageInsets
       }
    }
    
    • 按钮显示页面
    import UIKit
    
    class ButtonStyleViewControllerTwo: BaseViewController {
    
       @IBOutlet var btn1: UIButton!
       @IBOutlet var btn2: UIButton!
       @IBOutlet var btn3: UIButton!
       @IBOutlet var btn4: UIButton!
    
       override func viewDidLoad() {
           super.viewDidLoad()
           btn1.Jzz_setButtonStyle(buttonMode: .Top, spacing: 10)
           btn2.Jzz_setButtonStyle(buttonMode: .Left, spacing: 10)
           btn3.Jzz_setButtonStyle(buttonMode: .Right, spacing: 10)
           btn4.Jzz_setButtonStyle(buttonMode: .Bottom, spacing: 10)
           // Do any additional setup after loading the view.
       }
    
       /*
       // 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.destination.
           // Pass the selected object to the new view controller.
       }
       */
    }
    
    • 效果


      扩展Button按钮样式.png

    2.按钮懒加载,按钮样式

    lazy var btn_submit : UIButton = {
           let btn = UIButton()
           btn.setTitle("提 交", for: .normal)
           btn.addTarget(self, action:  #selector(self.savetest(_:)), for: .touchUpInside)
           btn.setTitleColor(UIColor.colorWithHex(hexColor: 0x8F8F8F), for: .normal)
           btn.backgroundColor = UIColor.white
           btn.layer.borderColor = UIColor.colorWithHex(hexColor: 0xE0E0E0).cgColor
           btn.layer.borderWidth = 1
           return btn
    }()
    

    3.Timer实现获取验证码倒计时按钮

    private var countdownTimer: Timer?
       
    private var remainingSeconds: Int = 0 {
       willSet {
           btn_phoneVerificationCode.setTitle("重新获取\(newValue)秒", for: .normal)
               
           if newValue <= 0 {
               btn_phoneVerificationCode.setTitle("获取验证码", for: .normal)
               isCounting = false
           }
       }
    }
       
    var isCounting = false {
       willSet {
           if newValue {
               countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateTime), userInfo: nil, repeats: true)
               remainingSeconds = 60
           } else {
               countdownTimer?.invalidate()
               countdownTimer = nil
           }
           btn_phoneVerificationCode.isEnabled = !newValue
       }
    }    
    
    @objc private func updateTime() {
       remainingSeconds -= 1
    }
    
    /*
    点击获取验证码按钮调用
    */
    self.isCounting = true
    
    导航栏-###

    1.隐藏导航栏

    override func viewWillAppear(_ animated: Bool) {
           super.viewWillAppear(animated)
               // 隐藏首页的导航栏 true 有动画
               self.navigationController?.setNavigationBarHidden(true, animated: true)
       }
       
    override func viewWillDisappear(_ animated: Bool) {
           super.viewWillDisappear(animated)
           // 跳转页面的导航 不隐藏 false
           self.navigationController?.setNavigationBarHidden(false, animated: true)
       }
    

    2.导航栏属性设置

    //防止页面上移,导航栏遮挡
    self.navigationBar.isTranslucent = false;
    //修改导航栏文字字体和大小
    self.navigationController?.navigationBar.titleTextAttributes =
               [NSAttributedString.Key.font: UIFont.italicSystemFont(ofSize: 28)]
    //修改导航栏文字颜色
    self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.black]
    ///导航栏背景颜色
    self.navigationController?.navigationBar.barTintColor = UIColor.white
    //关闭侧滑返回
    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false;
    ///导航栏背景图
    var image = UIImage()
    image = UIImage.init(named: "tabBar_bgImg")!
    //这句话按照比例延伸,显示完整图片
    image = image.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: UIImage.ResizingMode.stretch)
    self.navigationController?.navigationBar.setBackgroundImage(image, for: .default)
    
    UIView-###
    • 懒加载
    lazy var testView : UIView = {
           let _view = UIView.init(frame: CGRect(x: 20, y: 10, width: 200, height: 200))
           _view.backgroundColor = UIColor.red
           return _view
    }() 
    
    • 设置部分圆角

    1.UIView扩展

    extension UIView {
       /// SwifterSwift: Set some or all corners radiuses of view.
       ///
       /// - Parameters:
       ///   - corners: array of corners to change (example: [.bottomLeft, .topRight]).
       ///   - radius: radius for selected corners.
       func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
           let maskPath = UIBezierPath(
               roundedRect: bounds,
               byRoundingCorners: corners,
               cornerRadii: CGSize(width: radius, height: radius))
    
           let shape = CAShapeLayer()
           shape.path = maskPath.cgPath
           layer.mask = shape
       }
    }
    
    //调用
    //调用前 testView要设置好frame
    self.testView.roundCorners([.bottomLeft, .topRight], radius: 100)
    

    2.效果图


    下左右上圆角.png

    END

    相关文章

      网友评论

          本文标题:Swift 基础控件

          本文链接:https://www.haomeiwen.com/subject/wnysfltx.html