| // Copyright 2019-present the Material Components for iOS authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| import Foundation |
| import UIKit |
| import MaterialComponents.MaterialRipple |
| |
| class RippleView : UIView { |
| let statefulRippleView = MDCStatefulRippleView() |
| var didLongPress = false |
| lazy var longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress(gesture:))) |
| |
| override init(frame: CGRect) { |
| super.init(frame: frame) |
| commonRippleViewInit() |
| } |
| |
| required init?(coder aDecoder: NSCoder) { |
| super.init(coder: aDecoder) |
| commonRippleViewInit() |
| } |
| |
| func commonRippleViewInit() { |
| statefulRippleView.frame = self.bounds |
| statefulRippleView.autoresizingMask = [.flexibleHeight, .flexibleWidth] |
| addSubview(statefulRippleView) |
| longPressGesture.minimumPressDuration = 0.5 |
| longPressGesture.cancelsTouchesInView = false |
| addGestureRecognizer(longPressGesture) |
| isUserInteractionEnabled = true |
| layer.cornerRadius = 4 |
| layer.borderColor = UIColor.darkGray.withAlphaComponent(0.5).cgColor |
| layer.borderWidth = 0.5 |
| } |
| |
| override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { |
| statefulRippleView.touchesBegan(touches, with: event) |
| super.touchesBegan(touches, with: event) |
| |
| statefulRippleView.isRippleHighlighted = true |
| } |
| |
| override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { |
| statefulRippleView.touchesMoved(touches, with: event) |
| super.touchesMoved(touches, with: event) |
| } |
| |
| override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { |
| statefulRippleView.touchesEnded(touches, with: event) |
| super.touchesEnded(touches, with: event) |
| |
| statefulRippleView.isRippleHighlighted = false |
| if (!didLongPress) { |
| statefulRippleView.isSelected = !statefulRippleView.isSelected |
| } |
| didLongPress = false |
| } |
| |
| override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { |
| statefulRippleView.touchesCancelled(touches, with: event) |
| super.touchesCancelled(touches, with: event) |
| |
| statefulRippleView.isRippleHighlighted = false |
| } |
| |
| @objc func didLongPress(gesture: UILongPressGestureRecognizer) { |
| switch(gesture.state) { |
| case .began: |
| if (!statefulRippleView.allowsSelection) { |
| statefulRippleView.allowsSelection = true |
| statefulRippleView.isRippleHighlighted = false |
| statefulRippleView.isSelected = true |
| didLongPress = true |
| } |
| default: |
| break |
| } |
| } |
| } |
| |
| class StatefulRippleExample : UIViewController { |
| @IBOutlet weak var interactiveView: RippleView! |
| @IBOutlet weak var highlightedView: RippleView! |
| @IBOutlet weak var selectedView: RippleView! |
| @IBOutlet weak var draggedView: RippleView! |
| |
| override func viewDidLoad() { |
| let bundle = Bundle(for: StatefulRippleExample.self) |
| bundle.loadNibNamed("StatefulRippleExample", owner: self, options: nil) |
| view.frame = self.view.bounds |
| view.backgroundColor = .white |
| highlightedView.isUserInteractionEnabled = false |
| selectedView.isUserInteractionEnabled = false |
| draggedView.isUserInteractionEnabled = false |
| } |
| |
| override func viewDidLayoutSubviews() { |
| highlightedView.statefulRippleView.isRippleHighlighted = true |
| selectedView.statefulRippleView.allowsSelection = true |
| selectedView.statefulRippleView.isSelected = true |
| draggedView.statefulRippleView.isDragged = true |
| } |
| } |
| |
| extension StatefulRippleExample { |
| |
| @objc class func catalogMetadata() -> [String: Any] { |
| return [ |
| "breadcrumbs": ["Ripple", "Stateful Ripple"], |
| "primaryDemo": false, |
| "presentable": false, |
| ] |
| } |
| } |