名字: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
}