Advertisement
Guest User

Untitled

a guest
Nov 26th, 2016
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 5.20 KB | None | 0 0
  1. //
  2. //  RangeSlider.swift
  3. //  RouteBuilder
  4. //
  5. //  Created by Sascha Simon on 26.11.16.
  6. //  Copyright © 2016 Sascha Simon. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10. import UIKit
  11. import QuartzCore
  12.  
  13. @IBDesignable
  14. class RangeSlider : UIControl
  15. {
  16.     let trackLayer = RangeSliderTrackLayer()
  17.     let lowerThumbLayer = RangeSliderThumbLayer()
  18.     let upperThumbLayer = RangeSliderThumbLayer()
  19.     var previousLocation = CGPoint()
  20.    
  21.     var minimum: Double = 0.0
  22.     {
  23.         didSet
  24.         {
  25.             updateLayerFrames()
  26.         }
  27.     }
  28.    
  29.     var maximum: Double = 1.0
  30.     {
  31.         didSet
  32.         {
  33.             updateLayerFrames()
  34.         }
  35.     }
  36.    
  37.     var lowerValue: Double = 0.0
  38.     {
  39.         didSet
  40.         {
  41.             updateLayerFrames()
  42.         }
  43.     }
  44.    
  45.     var upperValue: Double = 1.0
  46.     {
  47.         didSet
  48.         {
  49.             updateLayerFrames()
  50.         }
  51.     }
  52.    
  53.     var trackTintColor: UIColor = UIColor(white: 0.9, alpha: 1.0)
  54.     {
  55.         didSet
  56.         {
  57.             trackLayer.setNeedsDisplay()
  58.         }
  59.     }
  60.    
  61.     var trackHighlightTintColor: UIColor = UIColor(red: 0.0, green: 0.45, blue: 0.94, alpha: 1.0)
  62.     {
  63.         didSet
  64.         {
  65.             trackLayer.setNeedsDisplay()
  66.         }
  67.     }
  68.    
  69.     var thumbTintColor: UIColor = UIColor.white
  70.     {
  71.         didSet
  72.         {
  73.             lowerThumbLayer.setNeedsDisplay()
  74.             upperThumbLayer.setNeedsDisplay()
  75.         }
  76.     }
  77.    
  78.     var thumbWidth: CGFloat
  79.     {
  80.         return CGFloat(bounds.height)
  81.     }
  82.    
  83.     override init(frame: CGRect)
  84.     {
  85.         super.init(frame: frame)
  86.        
  87.         trackLayer.rangeSlider = self
  88.         trackLayer.contentsScale = UIScreen.main.scale
  89.         layer.addSublayer(trackLayer)
  90.        
  91.         lowerThumbLayer.rangeSlider = self
  92.         lowerThumbLayer.contentsScale = UIScreen.main.scale
  93.         layer.addSublayer(lowerThumbLayer)
  94.        
  95.         upperThumbLayer.rangeSlider = self
  96.         upperThumbLayer.contentsScale = UIScreen.main.scale
  97.         layer.addSublayer(upperThumbLayer)
  98.     }
  99.    
  100.     required init?(coder aDecoder: NSCoder)
  101.     {
  102.         super.init(coder: aDecoder)
  103.     }
  104.    
  105.     func updateLayerFrames()
  106.     {
  107.         CATransaction.begin()
  108.         CATransaction.setDisableActions(true)
  109.        
  110.         trackLayer.frame = self.bounds.insetBy(dx: 0.0, dy: bounds.height / 3)
  111.         trackLayer.setNeedsDisplay()
  112.        
  113.         let lowerThumbCenter = CGFloat(positionForValue(lowerValue))
  114.        
  115.         lowerThumbLayer.frame = CGRect(x: lowerThumbCenter - thumbWidth / 2.0, y: 0.0,
  116.                                        width: thumbWidth, height: thumbWidth)
  117.         lowerThumbLayer.setNeedsDisplay()
  118.        
  119.         let upperThumbCenter = CGFloat(positionForValue(upperValue))
  120.         upperThumbLayer.frame = CGRect(x: upperThumbCenter - thumbWidth / 2.0, y: 0.0,
  121.                                        width: thumbWidth, height: thumbWidth)
  122.        
  123.         upperThumbLayer.setNeedsDisplay()
  124.        
  125.         CATransaction.commit()
  126.     }
  127.    
  128.     func positionForValue(_ value: Double) -> Double
  129.     {
  130.         return Double(bounds.width - thumbWidth) * (value - minimum) / (maximum - minimum) + Double(thumbWidth / 2.0)
  131.     }
  132.    
  133.     override var frame: CGRect
  134.     {
  135.         didSet
  136.         {
  137.             updateLayerFrames()
  138.         }
  139.     }
  140.    
  141.     override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool
  142.     {
  143.         previousLocation = touch.location(in: self)
  144.        
  145.         // Hit test the thumb layers
  146.         if lowerThumbLayer.frame.contains(previousLocation)
  147.         {
  148.             lowerThumbLayer.highlighted = true
  149.         } else if upperThumbLayer.frame.contains(previousLocation)
  150.         {
  151.             upperThumbLayer.highlighted = true
  152.         }
  153.        
  154.         return lowerThumbLayer.highlighted || upperThumbLayer.highlighted
  155.     }
  156.    
  157.     func boundValue(value: Double, toLowerValue lowerValue: Double, upperValue: Double) -> Double
  158.     {
  159.         return min(max(value, lowerValue), upperValue)
  160.     }
  161.    
  162.     override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool
  163.     {
  164.         let location = touch.location(in: self)
  165.        
  166.         // Determine by how much the user has dragged
  167.         let deltaLocation = Double(location.x - previousLocation.x)
  168.         let deltaValue = (maximum - minimum) * deltaLocation / Double(bounds.width - thumbWidth)
  169.        
  170.         previousLocation = location
  171.        
  172.         // Update the values
  173.         if lowerThumbLayer.highlighted
  174.         {
  175.             lowerValue += deltaValue
  176.             lowerValue = boundValue(value: lowerValue, toLowerValue: minimum, upperValue: upperValue)
  177.         }
  178.         else if upperThumbLayer.highlighted
  179.         {
  180.             upperValue += deltaValue
  181.             upperValue = boundValue(value: upperValue, toLowerValue: lowerValue, upperValue: maximum)
  182.         }
  183.        
  184.         sendActions(for: .valueChanged)
  185.        
  186.         return true
  187.     }
  188.    
  189.     override func endTracking(_ touch: UITouch?, with event: UIEvent?)
  190.     {
  191.         lowerThumbLayer.highlighted = false
  192.         upperThumbLayer.highlighted = false
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement