• 按钮的数量是不确定的,在将按钮添加到SearchView之前先记录下这按钮的maxX加上横向间距的值和y值,在布局下一按钮的时候先判断这一行余下的距离是否大于这按钮的宽度,也就是SearchView视图的宽度减去上一按钮...
    ![这里写图片描述](https://img-blog.csdn.net/20170602130346369?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRHJfRW5oYXJ0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    
    首先创建一个SearchView类,这个类分为上面的标题文字和下面的按钮.按钮的数量是不确定的,在将按钮添加到SearchView之前先记录下这个按钮的maxX加上横向间距的值和y值,在布局下一个按钮的时候先判断这一行余下的距离是否大于这个按钮的宽度,也就是SearchView视图的宽度减去上一个按钮的maxX加上横向间距的值是否大于这个按钮的宽度.如果大于就是说剩下的距离可以放下这个按钮,那么这个按钮的x值就是上一个按钮的maxX加上横向间距,y值与上一个按钮相同;如果小于就是说剩下的距离放不下这个按钮,那么就将这个按钮放到下一行,这个按钮的x值就是0,y值就是上一个按钮的y值加上纵向间距和按钮的高度.整个SearchView视图的高度是最后一个按钮的maxY.
    ```
    class SearchView: UIView {
        //标题
        private let titleLabel = UILabel()
        //上一个按钮的maxX加上间距
        private var lastX: CGFloat = 0
        //上一个按钮的y值
        private var lastY: CGFloat = 35
        //按钮的回调block
        private var btnCallBackBlock: ((_ btn: UIButton) -> ())?
        //SearchView的总高度
        var searchViewHeight: CGFloat = 0
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            titleLabel.frame = CGRect(x: 0, y: 0, width: frame.size.width - 30, height: 35)
            titleLabel.font = UIFont.systemFont(ofSize: 15)
            titleLabel.textColor = UIColor(red: 140 / 255.0, green: 140 / 255.0, blue: 140 / 255.0, alpha: 1)
            addSubview(titleLabel)
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        convenience init(frame: CGRect, titleLabelText: String, btnTexts: [String], btnCallBackBlock: @escaping ((_ sender: UIButton) -> ())) {
            self.init(frame: frame)
            
            titleLabel.text = titleLabelText
            //按钮文字的宽度
            var btnW: CGFloat = 0
            //按钮的高度
            let btnH: CGFloat = 30
            //文字与按钮两边的距离之和
            let addW: CGFloat = 30
            //横向间距
            let marginX: CGFloat = 10
            //纵向间距
            let marginY: CGFloat = 10
            
            for i in 0.. btnW {
                    btn.frame = CGRect(x: lastX, y: lastY, width: btnW, height: btnH)
                } else {
                    btn.frame = CGRect(x: 0, y: lastY + marginY + btnH, width: btnW, height: btnH)
                }
                lastX = btn.frame.maxX + marginX
                lastY = btn.frame.origin.y
                searchViewHeight = btn.frame.maxY
                addSubview(btn)
            }
            self.btnCallBackBlock = btnCallBackBlock
        }
        
        @objc private func btnClick(sender: UIButton) {
            btnCallBackBlock!(sender)
        }
    }
    ```
    点击热门搜索视图的按钮会发生四件事: 1.将按钮文字显示到搜索框 2.将按钮文字写入到偏好设置 3.在历史记录中显示按钮 4.更新清空历史按钮的状态
    
    ###常量
    ```
        let UIScreenBounds: CGRect = UIScreen.main.bounds
        let KNavigationBarBackgroundColor = UIColor(red: 249 / 255.0, green: 250 / 255.0, blue: 253 / 255.0, alpha: 1)
        let KGlobalBackgroundColor = UIColor(red: 239 / 255.0, green: 239 / 255.0, blue: 239 / 255.0, alpha: 1)
        let HistorySearch = "HistorySearch"
    ```
    ###把ScrollView添加到视图中
    ```
    private func setup() {               navigationController?.navigationBar.barTintColor = KNavigationBarBackgroundColor
            view.backgroundColor = KGlobalBackgroundColor
            
            view.addSubview(scrollView)
            scrollView.addSubview(cleanHistoryButton)
        }     
            lazy var scrollView: UIScrollView = {
            let scrollView = UIScrollView(frame: UIScreen.main.bounds)
            scrollView.alwaysBounceVertical = true
            scrollView.backgroundColor = UIColor(red: 239 / 255.0, green: 239 / 255.0, blue: 239 / 255.0, alpha: 1)
            scrollView.delegate = self
            return scrollView
        }()
    ```
    ###搜索框
    ```
        lazy var searchBar: UISearchBar = {
            let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width * 0.9, height: 30))
            searchBar.placeholder = "请输入商品名称"
            searchBar.barTintColor = UIColor.white
            searchBar.keyboardType = .default
            searchBar.delegate = self
            return searchBar
        }()
            //SearchBar代理方法
        func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
            if (searchBar.text?.characters.count)! > 0 {
            //将搜索框文字写入到偏好设置
                writeHistorySearchToUserDefaults(str: searchBar.text!)
            }
        }
        
            private func setupTilteView() {
            let bgView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreenBounds.width, height: 30))
            bgView.backgroundColor = UIColor.white
            bgView.layer.masksToBounds = true
            bgView.layer.cornerRadius = 6
            bgView.layer.borderColor = UIColor(red: 100 / 255.0, green: 100 / 255.0, blue: 100 / 255.0, alpha: 1).cgColor
            bgView.layer.borderWidth = 0.2
            UIGraphicsBeginImageContext(bgView.bounds.size)
            bgView.layer.render(in: UIGraphicsGetCurrentContext()!)
            let bgImage = UIGraphicsGetImageFromCurrentImageContext()
            searchBar.setSearchFieldBackgroundImage(bgImage, for: .normal)
            navigationItem.titleView = searchBar
        }
    ```
    ###热门搜索视图
    ```
        var hotSearchView: SearchView?
        private func setupHotSearchView() {
            //如果偏好设置为空写入一个空数组
            var historySearch = UserDefaults.standard.object(forKey: HistorySearch) as? [String]
            if historySearch == nil {
                historySearch = [String]()
                UserDefaults.standard.set(historySearch, forKey: HistorySearch)
            }
            
            //标签的标题 可以从服务器获得
            let arr = ["年货大集", "酸奶", "水", "车厘子", "洽洽瓜子", "维他", "香烟", "周黑鸭", "草莓", "星巴克", "卤味"]
            hotSearchView = SearchView(frame: CGRect(x: 10, y: 40, width: UIScreenBounds.width - 20, height: 100), titleLabelText: "热门搜索", btnTexts: arr, btnCallBackBlock: { [weak self](btn) in
                let str = btn.title(for: .normal)
                //将按钮文字显示到搜索框
                self?.searchBar.text = str
               //将按钮文字写入到偏好设置   self?.writeHistorySearchToUserDefaults(str: str!)
            })
            hotSearchView?.bounds.size.height = (hotSearchView?.searchViewHeight)!
            scrollView.addSubview(hotSearchView!)
        }
    ```
    ### 将历史搜索写入到偏好设置
    ```
        //将历史搜索写入偏好设置
        private func writeHistorySearchToUserDefaults(str: String) {
        //从偏好设置中读取
            var historySearch = UserDefaults.standard.object(forKey: HistorySearch) as? [String]
            //如果已经存在就不重复写入
            for text in historySearch! {
                if text == str {
                    return
                }
            }
            historySearch!.append(str)
            UserDefaults.standard.set(historySearch, forKey: HistorySearch)
            setupHistorySearchView()
        }
    ```
    ###历史记录视图
    ```
        var historySearchView: SearchView?
        private func setupHistorySearchView() {
            if historySearchView != nil {
                historySearchView?.removeFromSuperview()
                historySearchView = nil
            }
            
            //从偏好设置中读取
            let arr = UserDefaults.standard.object(forKey: HistorySearch) as! [String]
            if arr.count > 0 {
                historySearchView = SearchView(frame: CGRect(x: 10, y: (hotSearchView?.frame.maxY)! + 20, width: UIScreenBounds.width - 20, height: 0), titleLabelText: "历史记录", btnTexts: arr, btnCallBackBlock: { [weak self](btn) in
                    let str = btn.title(for: .normal)
                    self?.searchBar.text = str
                })
                historySearchView?.frame.size.height = (historySearchView?.searchViewHeight)!
                scrollView.addSubview(historySearchView!)
                updateCleanHistoryButton(hidden: false)
            }
        }
    ```
    ###更新清空历史视图状态
    ```
        private func updateCleanHistoryButton(hidden: Bool) {
            if historySearchView != nil {
                cleanHistoryButton.frame = CGRect(x: 0.1 * UIScreenBounds.width, y: (historySearchView?.frame.maxY)! + 20, width: UIScreenBounds.width * 0.8, height: 40)
            }
            cleanHistoryButton.isHidden = hidden
        }
    ```
    ###清空历史按钮
    ```
        lazy var cleanHistoryButton: UIButton = {
            let cleanHistoryButton = UIButton(type: .custom)
            cleanHistoryButton.setTitle("清 空 历 史", for: .normal)
            cleanHistoryButton.setTitleColor(UIColor(red: 153 / 255.0, green: 153 / 255.0, blue: 153 / 255.0, alpha: 1), for: .normal)
            cleanHistoryButton.titleLabel?.font = UIFont.systemFont(ofSize: 14)
            cleanHistoryButton.backgroundColor = UIColor(red: 239 / 255.0, green: 239 / 255.0, blue: 239 / 255.0, alpha: 1)
            cleanHistoryButton.layer.cornerRadius = 5
            cleanHistoryButton.layer.borderColor = UIColor(red: 200 / 255.0, green: 200 / 255.0, blue: 200 / 255.0, alpha: 1).cgColor
            cleanHistoryButton.layer.borderWidth = 0.5
            cleanHistoryButton.isHidden = true
            cleanHistoryButton.addTarget(self, action: #selector(cleanHistory), for: .touchUpInside)
            return cleanHistoryButton
        }()
        
        @objc private func cleanHistory() {
            var historys = UserDefaults.standard.object(forKey: HistorySearch) as? [String]
            historys?.removeAll()
            UserDefaults.standard.set(historys, forKey: HistorySearch)
            setupHistorySearchView()
            updateCleanHistoryButton(hidden: true)
        }
    ```
    展开全文
  • UITabBarController 是一常用的框架级控件 他的功能和UINavigationController比较...下来我们用Swift语言来实现一下这控件 首先,我们创建四ViewController 准备测试 创建完成之后在AppDelegate的启动方法中创建
  • 把let lable = UILable()初始化在class外是写不出循环控件...let lable = UILable(frame: CGRectMake())会出现四个标签 } 一个小坑,最后自己发现问题。 转载于:https://www.cnblogs.com/linximu/p/6143557.html...
  • 上班期间闲来无事,想摸鱼看番但是又害怕项目经理的制裁,那不如给自己找点事情做。...一简单的基于swift实现的顶部滚动标签栏,提供了四种不同的样式选择。 安装 可以直接通过我的github项目地址下载源码导入工...
  • 模拟凤凰新闻 | 更复杂的标签动画 - Swift 实现多个 TableView 的侧滑与切换 原文链接:模拟凤凰新闻 | 更复杂的标签动画 - Swift 实现多个 TableView 的侧滑与切换项目源码:github 仓库:模拟凤凰新闻首页 下午逛 ...
  • 开头:swift每天都在变的越来越流行,苹果公司也在不断的更新,如果你正开始一新项目或者在ios开发行业不落后,你应该学习掌握如何使用swift。为了你转变(从iOS转swift)更容易和节省你的时间,下面是我将自己整理...
  • 这个导航菜单是一组标签的集合,每个标签表示一个新闻类别,我们点击这个标签后下面就会切换到相应的分页面。同时左右滑动分页面,上方的标签也会跟着移动。 本文介绍一个优秀的第三方分页视图控件:...
  • 如果你正为移动设备开发应用程序,并且你还没有研究Swift,那么注意:当Swift涉及到Mac、iPhone、ipad、Apple Watch和未来设备的应用开发时,它不仅会排挤掉Objective-C,而且还会取代在Apple平台中做嵌入式开发的...
  • Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说创建一UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法进行调用首先代码:用init...
  • 先说根据服务器数据规格显示问题,类似标签,当所给的数据较时,单个按钮长度依规格字符长短而定,一屏铺开能显示几十几,宽度不够的改行显示,我数学不好,这其中涉及到的数学计算确实废了我不少脑细胞,网上...
  • SwiftyJSON:GitHub上最为开发者认可的JSON解析类Dollar.swiftSwift版Lo-Dash(或underscore)函数式工具库OAuthSwift:国外主流网站OAuth授权类库PathKit:小而美的路径管理类XCGLogger:功能完整的日志管理类库...
  • 1.3 Swift语言演进 2020-06-15 13:34:27
    1.3 Swift语言演进 小荷才露尖尖角,早有蜻蜓立上头...2010年7月,苹果开发部门高级总监、架构师克里斯·拉特纳 (Chris Lattner) 开始着手 Swift 编程语言的设计工作,在用一年时间完成基本架构后,他领导了一设计团
  • Swift方法参数名称省略 2016-04-21 00:13:24
    而对于实例方法来说,我们对其调用时Swift将忽略第一参数的标签,而强制要求之后的参数名称。队类方法也是如此。但有一例外,那就是如果这方法是一全局方法的话,参数名称默认是省略掉的。
  • 原文:http://www.coolketang.com/staticCoding/5a9923b4ac502e5d51cb3dc6.html1. Playground是苹果推出的一款用来学习、... 此时会打开一窗口,允许用户选择模板类型。点击顶部的标签,切换至苹果移动开发模板列...
  • Swift开发React Native组件 2018-01-17 15:19:38
    前面说过,React Native作为一全新的跨平台开发框架,好多东西还不是很成熟,很原生的控件还不是很完善,于是好多爱好者便自己封装相关的组件,可以使用oc来封装,也可以使用Swift来封装。关于封装的原理,大家...
  • swift解析html 2015-08-23 16:53:37
    介绍使用swift解析html的方法。
  • swift 4.2 TableView列表操作 2019-03-07 15:56:53
    对于开发应用来说,列表是最常用到一控件,而且对于列表的操作也最多,我们比较常用的有插入、删除、多选、排序、索引等等。那么今天我们就一一的实现我们这些功能。我们下面要用到Version 10.1,swift 版本是4.2...
  • 原文链接:Swift 实现多个 TableView 的侧滑与切换(模拟 instagram 系列)模拟 instagram 项目源码:github 仓库:模拟 instagram 关键词:Swift,实现多个 TableView 的侧滑与切换,在 ScrollView 中嵌套多个 ...
  • Swift4.2】筛选面板 2019-05-27 17:18:20
    我们如何在这样的一界面添加筛选面板才能更舒适一些呢!代码如下 筛选面板控制器的代码 // // SearchConditionViewController.swift // OPSHelper // // Created by Tony on 2019/4/30. // Copyright © 2019年 ...
  • 轻松地将多个标签添加到您的iOS应用,风格类似于iPad for Safari
1 2 3 4 5 ... 20
收藏数 7,442
精华内容 2,976