Swift - 滚动选择器

简介: Swift - 滚动选择器

先来看看效果

1.png

滚动选择器博主以前有写过Object-C版本的,地址:http://blog.csdn.net/codingfire/article/details/51684247

这里是用Swift写的,其实核心代码都差不多,也就不再做详细说明了,先看下主要代码:

import UIKit
class LHHScrollView: UIView,UIScrollViewDelegate {
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */
    var mainScrollView = UIScrollView()
    var titleScrollView = UIScrollView()
    var underLine = UIView()
    var _titleArray = NSArray()
    var selectIndex:Int = 0
    var cacheVC = CacheVC()
    /**
     初始化方法
     - parameter frame:      定义大小范围
     - parameter titleArray: 盛放标题
     - returns: nil
     */
    init(frame:CGRect , titleArray:NSArray) {
        super.init(frame: frame)
        _titleArray = NSArray(array: titleArray)
        self.backgroundColor = UIColor.lightGrayColor()
        self.creatMainScrollView(UIColor.whiteColor())
        self.creatSelectBtn(_titleArray)
        self.creatTitleScrollView()
    }
    /**
     创建滚动界面
     - parameter bgColor: 设置滚动条背景颜色
     */
    func creatMainScrollView(bgColor:UIColor) {
        mainScrollView.bounces = false
        mainScrollView.frame = CGRectMake(0, 0, WIDTH, HEIGHT-64)
        mainScrollView.showsHorizontalScrollIndicator = false
        mainScrollView.showsVerticalScrollIndicator = false
        mainScrollView.userInteractionEnabled = true
        mainScrollView.delegate = self
        mainScrollView.contentSize = CGSizeMake(CGFloat(_titleArray.count) * WIDTH, HEIGHT - 64)
        mainScrollView.scrollEnabled = true
        mainScrollView.pagingEnabled = true
        mainScrollView.backgroundColor = bgColor
        self.addSubview(mainScrollView)
    }
    /**
     创建滚动条
     */
    func creatTitleScrollView() {
        titleScrollView.bounces = false
        titleScrollView.frame = CGRectMake(0, 0, WIDTH, 42)
        titleScrollView.showsHorizontalScrollIndicator = false
        titleScrollView.showsVerticalScrollIndicator = false
        titleScrollView.userInteractionEnabled = true
        titleScrollView.scrollEnabled = true
        titleScrollView.backgroundColor = UIColor.lightGrayColor()
        self.addSubview(titleScrollView)
    }
    /**
     创建按钮和滑块
     - parameter titleArray: 标题
     */
    func creatSelectBtn(titleArray:NSArray) {
        var width:CGFloat
        width = 5
        for index in 0..<titleArray.count {
            let btn = UIButton(type: .Custom)
            btn.frame = CGRectMake(width, 5, self.legthOfTitle(titleArray[index] as! String)+30, 30)
            btn.setTitle(titleArray[index] as? String, forState: .Normal)
            btn.backgroundColor = UIColor.orangeColor()
            btn.layer.cornerRadius = 5
            btn.titleLabel?.font = UIFont.systemFontOfSize(13)
            btn.setTitleColor(UIColor.blackColor(), forState: .Normal)
            btn.tag = index + 50
            btn.addTarget(self, action: #selector(self.btnAction(_:)), forControlEvents: .TouchUpInside)
            titleScrollView.addSubview(btn)
            let lineView = UIView(frame: CGRectMake(width, 39, self.legthOfTitle(titleArray[index] as! String)+30, 3))
            lineView.tag = 100 + index
            lineView.backgroundColor = UIColor.redColor()
            lineView.hidden = true
            titleScrollView.addSubview(lineView)
            if index == 50 {
                btn.setTitleColor(UIColor.redColor(), forState: .Selected)
            }
            if lineView.tag == 100 {
                lineView.hidden = false
            }
            width = width + self.legthOfTitle(titleArray[index] as! String) + 30 + 10
        }
        selectIndex = 0
        titleScrollView.contentSize = CGSizeMake(width, 40)
        let viewVC = ViewController1()
        viewVC.contentID =  "\(selectIndex)"
        viewVC.view.frame = CGRectMake(0, 42, WIDTH, HEIGHT - 64 - 42)
        mainScrollView.addSubview(viewVC.view)
        cacheVC.addCurrentVC(selectIndex)
    }
    /**
     计算标题长度
     - parameter title: 标题
     - returns: 标题长度
     */
    func legthOfTitle(title:String) -> CGFloat {
        let attribute = [NSFontAttributeName: UIFont.systemFontOfSize(13)]
//        let text: NSString = NSString(CString: title.cStringUsingEncoding(NSUTF8StringEncoding)!,encoding: NSUTF8StringEncoding)!
        let option = NSStringDrawingOptions.UsesFontLeading
        let size = title.boundingRectWithSize(CGSizeMake(1000, 30), options:option, attributes: attribute, context: nil)
        return size.width
    }
    /**
     点击按钮响应事件
     - parameter btn: tag从50开始
     */
    func btnAction(btn:UIButton) {
        selectIndex = btn.tag - 50
        print(btn.tag)
        /// 按钮和滑块变为未选状态
        for var view in titleScrollView.subviews {
            if view.isKindOfClass(UIButton) {
                let button = view as! UIButton
                button.setTitleColor(UIColor.blackColor(), forState: .Normal)
            }
            else
            {
                let lineView = view 
                lineView.hidden = true
            }
        }
        btn.setTitleColor(UIColor.redColor(), forState: .Normal)
        let lineView = titleScrollView.viewWithTag(selectIndex + 100)
        lineView?.hidden = false
        /**
         *  对当前控制器做处理
         *
         *  @param selectIndex 当前控制器标号
         *
         *  @return nil
         */
        if !cacheVC.vcArray.containsObject(selectIndex) {
            let viewVC = ViewController1()
            viewVC.contentID =  "\(selectIndex)"
            viewVC.view.frame = CGRectMake(CGFloat(selectIndex) * WIDTH, 42, WIDTH, HEIGHT - 64 - 42)
            mainScrollView.addSubview(viewVC.view)
            cacheVC.addCurrentVC(selectIndex)
        }
        /**
         *  设置偏移量
         *
         *  @param self.selectIndex 当前位置
         *
         *  @return nil
         */
        self.mainScrollView.contentOffset = CGPointMake(CGFloat(self.selectIndex) * WIDTH, 0)
        /// 获取当前按钮左右按钮
        let btnRight = titleScrollView.viewWithTag(btn.tag + 1)
        let btnLeft = titleScrollView.viewWithTag(btn.tag - 1)
        /**
         *  通过位置判断偏移量
         */
        if (btn.frame.origin.x + btn.frame.size.width) > WIDTH - 10{
            if btn.tag - 50 != _titleArray.count - 1 {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(btnRight!.frame.origin.x + btnRight!.frame.size.width - WIDTH + 10, 0);
                })
            }
        }
        else
        {
            if selectIndex == 0 {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(0, 0)
                })
            }
            else
            {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(btnLeft!.frame.origin.x, 0)
                })
            }
        }
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    /**
     scrollView代理方法
     - parameter scrollView: 滑动界面相应事件
     */
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        selectIndex = Int(mainScrollView.contentOffset.x / WIDTH)
        /// 按钮和滑块变为未选状态
        for var view in titleScrollView.subviews {
            if view.isKindOfClass(UIButton) {
                let button = view as! UIButton
                button.setTitleColor(UIColor.blackColor(), forState: .Normal)
            }
            else
            {
                let lineView = view
                lineView.hidden = true
            }
        }
        let btn = titleScrollView.viewWithTag(selectIndex + 50) as! UIButton
        btn.setTitleColor(UIColor.redColor(), forState: .Normal)
        let lineView = titleScrollView.viewWithTag(selectIndex + 100)
        lineView?.hidden = false
        /**
         *  对当前控制器做处理
         *
         *  @param selectIndex 当前控制器标号
         *
         *  @return nil
         */
        if !cacheVC.vcArray.containsObject(selectIndex) {
            let viewVC = ViewController1()
            viewVC.contentID =  "\(selectIndex)"
            viewVC.view.frame = CGRectMake(CGFloat(selectIndex) * WIDTH, 42, WIDTH, HEIGHT - 64 - 42)
            mainScrollView.addSubview(viewVC.view)
            cacheVC.addCurrentVC(selectIndex)
        }
        /**
         *  设置偏移量
         *
         *  @param self.selectIndex 当前位置
         *
         *  @return nil
         */
        self.mainScrollView.contentOffset = CGPointMake(CGFloat(selectIndex) * WIDTH, 0)
        /// 获取当前按钮左右按钮
        let btnRight = titleScrollView.viewWithTag(selectIndex + 50 + 1)
        let btnLeft = titleScrollView.viewWithTag(selectIndex + 50 - 1)
        /**
         *  通过位置判断偏移量
         */
        if (btn.frame.origin.x + btn.frame.size.width) > WIDTH - 10{
            if btn.tag - 50  != _titleArray.count - 1 {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(btnRight!.frame.origin.x + btnRight!.frame.size.width - WIDTH + 10, 0);
                })
            }
        }
        else
        {
            if selectIndex == 0 {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(0, 0)
                })
            }
            else
            {
                UIView.animateWithDuration(0.3, animations: {
                    self.titleScrollView.contentOffset = CGPointMake(btnLeft!.frame.origin.x, 0)
                })
            }
        }
    }
}

代码中都给出了注释,还有不懂的请留言,下载地址:https://github.com/codeliu6572/Swift_Scroll_Select

目录
相关文章
|
Swift
Swift -banner滚动图自定义
Swift -banner滚动图自定义
242 0
Swift -banner滚动图自定义
|
算法
swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动
原文:swift语言实战晋级-第9章 游戏实战-跑酷熊猫-9-10 移除平台与视差滚动 9.9 移除场景之外的平台       用为平台是源源不断的产生的,如果不注意销毁,平台就将越积越多,虽然在游戏场景中看不到。
1091 0
|
Swift
Swift游戏实战-跑酷熊猫 10 视差滚动背景
原文:Swift游戏实战-跑酷熊猫 10 视差滚动背景 原理   实现   勘误 “实现”的视频中有个错误,如下 背景移动时有个错误,看红色部分,近景归位时,第二张图片的下标是1 if arrBG[0].
1109 0
|
7月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
430 2
|
5月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
172 3
|
29天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
29 2
|
1月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
56 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
58 5
|
4月前
|
存储 移动开发 Swift
使用Swift进行iOS应用开发:探索现代移动开发的魅力
【8月更文挑战第12天】使用Swift进行iOS应用开发,不仅能够享受到Swift语言带来的简洁、快速、安全的编程体验,还能够充分利用iOS平台提供的丰富资源和强大功能。然而,iOS应用开发并非易事,需要开发者具备扎实的编程基础、丰富的实践经验和不断学习的精神。希望本文能够为您的iOS应用开发之旅提供一些有益的参考和帮助。
|
5月前
|
Swift iOS开发 Kotlin
苹果iOS新手开发之Swift中实现类似Kotlin的作用域函数
Swift可通过扩展实现类似Kotlin作用域函数效果。如自定义`let`, `run`, `with`, `apply`, `also`,增强代码可读性和简洁性。虽无直接内置支持,但利用Swift特性可达成相似功能。
78 7