JXSegmentedIndicatorGradientLineView.swift 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // JXSegmentedIndicatorGradientLineView.swift
  3. // JXSegmentedView
  4. //
  5. // Created by jiaxin on 2020/7/6.
  6. // Copyright © 2020 jiaxin. All rights reserved.
  7. //
  8. import UIKit
  9. /// 会无视indicatorColor属性,以gradientColors为准
  10. open class JXSegmentedIndicatorGradientLineView: JXSegmentedIndicatorLineView {
  11. open var colors = [UIColor]()
  12. open var startPoint = CGPoint.zero
  13. open var endPoint = CGPoint(x: 1, y: 0)
  14. open var locations: [NSNumber]?
  15. public let gradientLayer = CAGradientLayer()
  16. open override func commonInit() {
  17. super.commonInit()
  18. layer.masksToBounds = true
  19. layer.addSublayer(gradientLayer)
  20. }
  21. open override func refreshIndicatorState(model: JXSegmentedIndicatorSelectedParams) {
  22. super.refreshIndicatorState(model: model)
  23. backgroundColor = .clear
  24. CATransaction.begin()
  25. CATransaction.setDisableActions(true)
  26. gradientLayer.frame = bounds
  27. gradientLayer.colors = colors.map { $0.cgColor }
  28. gradientLayer.startPoint = startPoint
  29. gradientLayer.endPoint = endPoint
  30. gradientLayer.locations = locations
  31. CATransaction.commit()
  32. }
  33. open override func contentScrollViewDidScroll(model: JXSegmentedIndicatorTransitionParams) {
  34. super.contentScrollViewDidScroll(model: model)
  35. guard canHandleTransition(model: model) else {
  36. return
  37. }
  38. CATransaction.begin()
  39. CATransaction.setDisableActions(true)
  40. gradientLayer.frame = bounds
  41. CATransaction.commit()
  42. }
  43. open override func selectItem(model: JXSegmentedIndicatorSelectedParams) {
  44. super.selectItem(model: model)
  45. let targetWidth = getIndicatorWidth(itemFrame: model.currentSelectedItemFrame, itemContentWidth: model.currentItemContentWidth)
  46. CATransaction.begin()
  47. CATransaction.setAnimationDuration(scrollAnimationDuration)
  48. CATransaction.setAnimationTimingFunction(.init(name: .easeOut))
  49. gradientLayer.frame.size.width = targetWidth
  50. CATransaction.commit()
  51. }
  52. }