Swift分段控件实现

github地址

名字:GLSegmentView

描述:

该控件一般和UIScrollView一起使用,点击控件通过代理回调给UIScrollView来
改变ContentOffset来达到控制页数的效果

功能:

  • 可根据滑动的距离来实时更新底部线条的位置和宽度;
  • 宽度是根据每个分割的控件title的宽度而定;
  • 根据滑动距离实时颜色渐变;
  • 支持code,xib,storyboard;
  • 支持旋转

展示图

iPhone

iPad

使用:

xib:

        let titles =  ["路飞", "Medbanks", "One", "Piece", "god~long"]

        self.segmentView.titleArray = titles
        self.segmentView.delegate = self

    //MARK: UIScrollViewDelegate
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        self.segmentView.updateSegmentView(scrollView.contentOffset.x, pageWidth: scrollView.frame.width)
    }

    //MARK: SegmentSlideViewDelegate
    func didSelectSegment(_ index: Int) {
        // animated必须为false,如果想点击segment的时候也动画滑动,必须添加额外的参数控制
        self.contentScrollView!.setContentOffset(CGPoint(x: CGFloat(index) * ScreenWidth, y: 0), animated: false)
    }

code:

         // 代码创建 需要去掉属性的IBOutlet
        self.segmentView = GLSegmentSlideView(frame: CGRect(x: 0, y: 0, width: ScreenWidth, height: 50))
        self.segmentView.titleArray = titles
        self.segmentView?.delegate = self
        self.view.addSubview(self.segmentView!)


如果需要支持旋转

    // MARK: 如果是iPhone需要屏幕旋转功能,必须添加此方法
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        self.segmentView.beforeLayoutIndex = self.segmentView.currentSelectIndex
    }

后记:

在添加支持旋转功能的时候,遇到了问题,屏幕旋转之后,有时scrollView的contentOffset会发生改变,这就导致currentIndex(当前选中的item)会发生变化。
后来添加监听屏幕旋转

 UIDevice.current.beginGeneratingDeviceOrientationNotifications()
        
 NotificationCenter.default.addObserver(self, selector: #selector(handleDeviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)

但是发现个坑

在iPad上旋转屏幕后会先触发此通知(NSNotification.Name.UIDeviceOrientationDidChange),再调用layoutSubviews
在iPhone上旋转屏幕后会先调用layoutSubviews,再触发此通知(NSNotification.Name.UIDeviceOrientationDidChange)。

所以有了在iPhone中如果要支持旋转的话,必须添加该方法

    // MARK: 如果是iPhone需要屏幕旋转功能,必须添加此方法
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        self.segmentView.beforeLayoutIndex = self.segmentView.currentSelectIndex
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,273评论 4 61
  • 1.badgeVaule气泡提示 2.git终端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夹内容...
    i得深刻方得S阅读 4,805评论 1 9
  • ssh断开问题 vim /etc/ssh/sshd_config去掉注释,改成ClientAliveInterva...
    Moon_Yue阅读 696评论 0 0
  • 比如台球,手机游戏,可以是人际关系的润滑剂。从这个角度来看,所有的兴趣爱好,摄影,乐器,运动都可以是。 人是社会动...
    骁龙阅读 153评论 0 0
  • Robyn_Luo阅读 243评论 0 0