mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
This is a follow up PR for #7166 adds @objc annotations to Swift catalogMetadata() methods, because the Swift 4 compiler no longer attempts to infer what methods should be visible to Objective-C. As a result of this change in the compiler, no Swift examples were showing up in Dragons after #7166. See this article: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/ for additional context.
126 lines
4.1 KiB
Swift
126 lines
4.1 KiB
Swift
// 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,
|
|
]
|
|
}
|
|
}
|