From d0779bd9e91ac29e60d65804a142bd3c45e78808 Mon Sep 17 00:00:00 2001 From: iWw Date: Thu, 1 Dec 2022 17:29:32 +0800 Subject: [PATCH] Fix some error, and improvement animate --- Demo/Marker/Base.lproj/Main.storyboard | 79 ++++++++++++++++---------- Demo/Marker/ViewController.swift | 24 +++++--- Sources/Marker/Marker+Calculate.swift | 2 +- Sources/Marker/Marker+Draw.swift | 11 ++-- Sources/Marker/Marker+Info+Style.swift | 7 +++ Sources/Marker/Marker+Info.swift | 9 +++ Sources/Marker/Marker.swift | 13 +++-- 7 files changed, 97 insertions(+), 48 deletions(-) diff --git a/Demo/Marker/Base.lproj/Main.storyboard b/Demo/Marker/Base.lproj/Main.storyboard index 435f642..3c35e68 100644 --- a/Demo/Marker/Base.lproj/Main.storyboard +++ b/Demo/Marker/Base.lproj/Main.storyboard @@ -1,6 +1,6 @@ - - + + @@ -9,62 +9,62 @@ - + - + - + - + - + - + @@ -79,10 +79,10 @@ - + @@ -95,53 +95,53 @@ - + - + - + - + @@ -156,7 +156,7 @@ - + @@ -233,11 +233,12 @@ - + + @@ -263,6 +264,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/Demo/Marker/ViewController.swift b/Demo/Marker/ViewController.swift index 60a3e63..f9c7b49 100644 --- a/Demo/Marker/ViewController.swift +++ b/Demo/Marker/ViewController.swift @@ -28,11 +28,27 @@ class ViewController: UIViewController { @IBOutlet weak var clickableInButton: UIButton! @IBOutlet weak var clickableOutButton: UIButton! + @objc func dismissBarButtonMarkerAction(_ sender: UIButton) { + Marker.instance(from: "nav-bar-marker")?.dismiss() + } + override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. view.backgroundColor = .white + let barButton = UIButton(type: .custom) + barButton.setTitle("OnBarButton", for: .normal) + barButton.setTitleColor(.black, for: .normal) + barButton.addTarget(self, action: #selector(dismissBarButtonMarkerAction(_:)), for: .touchUpInside) + let item = UIBarButtonItem(customView: barButton) + self.navigationItem.rightBarButtonItem = item + + DispatchQueue.main.asyncAfter(wallDeadline: .now() + 1) { + Marker(Marker.Info(marker: barButton, intro: "Show on navigation bar. tap highlight range to dismiss.", styles: [.spacing(-10)], options: [.decoration]), identifier: "nav-bar-marker") + .show(on: self.view) + } + startButton.addTarget(self, action: #selector(tapAction(sender:)), for: .touchUpInside) let buttons = [startButton, number2Button, respondActionButton, noMaskButton, roundButton, squareButton, followStyleButton, bottomButton, bottomButton] + bottomButtons @@ -82,14 +98,6 @@ class ViewController: UIViewController { Marker(info, identifier: "inSubview").show(on: subviewContainer, completion: nil) } - @objc func topLeftAlert(sender: UIButton) { - let alert = UIAlertController(title: "提示", message: "透传事件", preferredStyle: .alert) - alert.addAction(.init(title: "确认", style: .default, handler: nil)) - present(alert, animated: true, completion: nil) - - Marker.instance(from: "asdf")?.dismiss(triggerByUser: true) - } - @objc func tapAction(sender: UIButton) { // global configure. Use it in AppDelegate.swift(application.didFinishLaunchingWithOptions), if needed // 全局配置, 如果需要, 可以在应用启动时进行配置, 这里仅作为演示 diff --git a/Sources/Marker/Marker+Calculate.swift b/Sources/Marker/Marker+Calculate.swift index 1a37229..63a2061 100644 --- a/Sources/Marker/Marker+Calculate.swift +++ b/Sources/Marker/Marker+Calculate.swift @@ -39,7 +39,7 @@ extension Marker { return nil } - self.spacing = Marker.default.spacing + self.spacing = info.spacing self.innerFrame = markedSuperview.convert(marked.frame, to: onView) self.isRound = marked.layer.cornerRadius == innerFrame.height / 2 self.markerFrame = info.dimFrame == .zero ? .zero : innerFrame.insetBy(dx: -info.enlarge, dy: -info.enlarge) diff --git a/Sources/Marker/Marker+Draw.swift b/Sources/Marker/Marker+Draw.swift index 926033c..9a2caa2 100644 --- a/Sources/Marker/Marker+Draw.swift +++ b/Sources/Marker/Marker+Draw.swift @@ -107,16 +107,17 @@ extension Marker { } // MARK: check and fix origin.x - if gradientRect.minX < 10 { // horizontally safe area + var gradientRectAtWindow = self.convert(gradientRect, to: nil) + if gradientRectAtWindow.minX < 10 { // horizontally safe area gradientRect.origin.x = 10 } - if gradientRect.maxX > calculate.safetyRangeSize.width { + if gradientRectAtWindow.maxX > calculate.safetyRangeSize.width { gradientRect.origin.x = calculate.safetyRangeSize.width - gradientRect.width } // MARK: origin.y - let topOriginY: CGFloat = highlightRangeRect.minY - Marker.default.spacing - gradientRect.height - bumpHeight - let bottomOriginY: CGFloat = highlightRangeRect.maxY + Marker.default.spacing + bumpHeight + let topOriginY: CGFloat = highlightRangeRect.minY - calculate.info.spacing - gradientRect.height - bumpHeight + let bottomOriginY: CGFloat = highlightRangeRect.maxY + calculate.info.spacing + bumpHeight var resultVAlignment: Info.VAlignment = .auto switch calculate.info.vAlignment { @@ -125,7 +126,7 @@ extension Marker { resultVAlignment = .top // MARK: check and fix origin.y - let gradientRectAtWindow = self.convert(gradientRect, to: nil) + gradientRectAtWindow = self.convert(gradientRect, to: nil) if gradientRectAtWindow.minY < 120 { // display on dynamic island or notch // switch to `.bottom` diff --git a/Sources/Marker/Marker+Info+Style.swift b/Sources/Marker/Marker+Info+Style.swift index 888b54a..9c912e4 100644 --- a/Sources/Marker/Marker+Info+Style.swift +++ b/Sources/Marker/Marker+Info+Style.swift @@ -24,6 +24,10 @@ extension Marker.Info { case hAlignment(HAlignment) case vAlignment(VAlignment) + + /// Spacing between triangle arrow and highlighted view. + /// Default value see `Marker.default.spacing`. + case spacing(CGFloat) } } @@ -65,6 +69,9 @@ extension Marker.Info.Style: Equatable { case (.vAlignment(_), .vAlignment(_)): return true + case (.spacing(_), .spacing(_)): + return true + default: return false } diff --git a/Sources/Marker/Marker+Info.swift b/Sources/Marker/Marker+Info.swift index 207d346..55a8155 100644 --- a/Sources/Marker/Marker+Info.swift +++ b/Sources/Marker/Marker+Info.swift @@ -22,6 +22,7 @@ extension Marker { let textColor: UIColor let timeout: TimeInterval let enlarge: CGFloat + let spacing: CGFloat let hAlignment: HAlignment let vAlignment: VAlignment @@ -139,6 +140,14 @@ extension Marker { self.vAlignment = .auto } + if let spacingStyle = styles.first(where: { $0 == .spacing(0) }), + case .spacing(let value) = spacingStyle + { + self.spacing = value + } else { + self.spacing = Marker.default.spacing + } + self.isDecoration = options.contains(.decoration) self.isStrongGuidance = options.contains(.strongGuidance) self.isEventPenetration = options.contains(.eventPenetration) diff --git a/Sources/Marker/Marker.swift b/Sources/Marker/Marker.swift index 82cf5ab..138ed1f 100644 --- a/Sources/Marker/Marker.swift +++ b/Sources/Marker/Marker.swift @@ -127,8 +127,11 @@ public class Marker: UIView { if contentView.frame == .zero { contentView.alpha = 0 contentView.frame = gradientFrame - contentView.transform = CGAffineTransform(translationX: 0, y: vAlignment == .top ? 20 : -20) - .concatenating(CGAffineTransform(scaleX: 0.95, y: 0.95)) + contentView.transform = CGAffineTransform( + translationX: 0, + y: vAlignment == .top ? (current.spacing) : (-current.spacing) + ) + .concatenating(CGAffineTransform(scaleX: 0.98, y: 0.98)) UIView.animate(withDuration: animateDuration) { self.contentView.alpha = 1 @@ -234,12 +237,14 @@ public extension Marker { func dismiss(triggerByUser: Bool = true) { Self.removeInstance(self) + let translationY: CGFloat = self.lastVAlignment == .bottom ? (-current.spacing) : (current.spacing) + UIView.animate(withDuration: animateDuration) { self.dimmingView.alpha = 0 self.contentView.alpha = 0 - self.contentView.transform = CGAffineTransform(translationX: 0, y: self.lastVAlignment == .bottom ? -20 : 20) - .concatenating(CGAffineTransform(scaleX: 0.95, y: 0.95)) + self.contentView.transform = CGAffineTransform(translationX: 0, y: translationY) + .concatenating(CGAffineTransform(scaleX: 0.98, y: 0.98)) } completion: { (_) in self.completion?(self, triggerByUser) self.completion = nil