Compare commits

...

2 Commits

Author SHA1 Message Date
Duraid Abdul b435de87a2 Add FrameRateRequest 2021-11-11 20:28:16 -08:00
Duraid Abdul 372c8ce90b Update LCManager.swift 2021-10-16 17:40:08 -06:00
2 changed files with 97 additions and 18 deletions
+79 -18
View File
@@ -15,8 +15,8 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
public static let shared = LCManager()
/// Set the font size. The font can be set to a minimum value of 5.0 and a maximum value of 20.0. The default value is 7.5.
public var fontSize: CGFloat = 7.5 {
/// Set the font size. The font can be set to a minimum value of 5.0 and a maximum value of 20.0. The default value is 8.
public var fontSize: CGFloat = 8 {
didSet {
guard fontSize >= 4 else { fontSize = 4; return }
guard fontSize <= 20 else { fontSize = 20; return }
@@ -44,7 +44,7 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
}
}
let defaultConsoleSize = CGSize(width: 228, height: 142)
let defaultConsoleSize = CGSize(width: 240, height: 148)
lazy var borderView = UIView()
@@ -109,22 +109,22 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
// Update text view width.
if consoleView.frame.size.width > ResizeController.kMaxConsoleWidth {
consoleTextView.frame.size.width = ResizeController.kMaxConsoleWidth - 4
consoleTextView.frame.size.width = ResizeController.kMaxConsoleWidth - 2
} else if consoleView.frame.size.width < ResizeController.kMinConsoleWidth {
consoleTextView.frame.size.width = ResizeController.kMinConsoleWidth - 4
consoleTextView.frame.size.width = ResizeController.kMinConsoleWidth - 2
} else {
consoleTextView.frame.size.width = consoleSize.width - 4
consoleTextView.frame.size.width = consoleSize.width - 2
}
// Update text view height.
if consoleView.frame.size.height > ResizeController.kMaxConsoleHeight {
consoleTextView.frame.size.height = ResizeController.kMaxConsoleHeight - 4
consoleTextView.frame.size.height = ResizeController.kMaxConsoleHeight - 2
+ (consoleView.frame.size.height - ResizeController.kMaxConsoleHeight) * 2 / 3
} else if consoleView.frame.size.height < ResizeController.kMinConsoleHeight {
consoleTextView.frame.size.height = ResizeController.kMinConsoleHeight - 4
consoleTextView.frame.size.height = ResizeController.kMinConsoleHeight - 2
+ (consoleView.frame.size.height - ResizeController.kMinConsoleHeight) * 2 / 3
} else {
consoleTextView.frame.size.height = consoleSize.height - 4
consoleTextView.frame.size.height = consoleSize.height - 2
}
consoleTextView.contentOffset.y = consoleTextView.contentSize.height - consoleTextView.bounds.size.height
@@ -254,7 +254,7 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
consoleView.layer.shadowOffset = CGSize(width: 0, height: 2)
consoleView.alpha = 0
consoleView.layer.cornerRadius = 22
consoleView.layer.cornerRadius = 24
consoleView.layer.cornerCurve = .continuous
let _ = lumaView
@@ -270,10 +270,10 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
consoleView.addSubview(borderView)
// Configure text view.
consoleTextView.frame = CGRect(x: 2, y: 2, width: consoleSize.width - 4, height: consoleSize.height - 4)
consoleTextView.frame = CGRect(x: 1, y: 1, width: consoleSize.width - 2, height: consoleSize.height - 2)
consoleTextView.isEditable = false
consoleTextView.backgroundColor = .clear
consoleTextView.textContainerInset = UIEdgeInsets(top: 10, left: 8, bottom: 10, right: 8)
consoleTextView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
consoleTextView.isSelectable = false
consoleTextView.showsVerticalScrollIndicator = false
@@ -297,7 +297,7 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
consoleView.addGestureRecognizer(longPressRecognizer)
// Prepare menu button.
let diameter = CGFloat(28)
let diameter = CGFloat(30)
// This tuned button frame is used to adjust where the menu appears.
menuButton = UIButton(frame: CGRect(x: consoleView.bounds.width - 44,
@@ -318,7 +318,7 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
menuButton.addSubview(circle)
let ellipsisImage = UIImageView(image: UIImage(systemName: "ellipsis",
withConfiguration: UIImage.SymbolConfiguration(pointSize: 17, weight: .medium)))
withConfiguration: UIImage.SymbolConfiguration(pointSize: 18, weight: .medium)))
ellipsisImage.frame.size = circle.bounds.size
ellipsisImage.contentMode = .center
circle.addSubview(ellipsisImage)
@@ -413,9 +413,11 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
if isVisible {
if !isConsoleConfigured {
configureWindow()
configureConsole()
isConsoleConfigured = true
DispatchQueue.main.async { [self] in
configureWindow()
configureConsole()
isConsoleConfigured = true
}
}
commitTextChanges(requestMenuUpdate: true)
@@ -832,9 +834,13 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
}
}
let consolePiPPanner_frameRateRequest = FrameRateRequest()
@objc func consolePiPPanner(recognizer: UIPanGestureRecognizer) {
if recognizer.state == .began {
consolePiPPanner_frameRateRequest.isActive = true
initialViewLocation = consoleView.center
}
@@ -859,6 +865,9 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
case .ended, .cancelled:
consolePiPPanner_frameRateRequest.isActive = true
FrameRateRequest().perform(duration: 0.5)
// After the PiP is thrown, determine the best corner and re-target it there.
let decelerationRate = UIScrollView.DecelerationRate.normal.rawValue
@@ -911,7 +920,9 @@ public class LCManager: NSObject, UIGestureRecognizerDelegate {
UIViewPropertyAnimator(duration: 0.4, dampingRatio: 1) { [self] in
if !grabberMode {
consoleTextView.alpha = 1
menuButton.alpha = 1
if !ResizeController.shared.isActive {
menuButton.alpha = 1
}
}
}.startAnimation()
}
@@ -1111,3 +1122,53 @@ extension TimeInterval {
fileprivate func _debugPrint(_ items: Any) {
print(items)
}
// MARK: Frame Rate Request
/**
An object that allows you to manually request an increased display refresh rate on ProMotion devices.
*The display refresh rate does not exceed 60 Hz when low power mode is enabled.*
**Do not set an excessive duration. Doing so will negatively impact battery life.**
```
// Example
let request = FrameRateRequest(preferredFrameRate: 120,
duration: 0.4)
request.perform()
```
*/
class FrameRateRequest {
lazy private var displayLink = CADisplayLink(target: self, selector: #selector(dummyFunction))
var isActive: Bool = false {
didSet {
guard #available(iOS 15, *) else { return }
guard isActive != oldValue else { return }
if isActive {
displayLink.add(to: .current, forMode: .common)
} else {
displayLink.remove(from: .current, forMode: .common)
}
}
}
/// Prepares your frame rate request parameters.
init(preferredFrameRate: Float = Float(UIScreen.main.maximumFramesPerSecond)) {
if #available(iOS 15, *) {
displayLink.preferredFrameRateRange = CAFrameRateRange(minimum: 30, maximum: Float(UIScreen.main.maximumFramesPerSecond), preferred: preferredFrameRate)
}
}
/// Perform frame rate request.
func perform(duration: Double) {
isActive = true
DispatchQueue.main.asyncAfter(deadline: .now() + duration) { [self] in
isActive = false
}
}
@objc private func dummyFunction() {}
}
@@ -115,6 +115,8 @@ class ResizeController {
// Ensure initial autolayout is performed unanimated.
LCManager.shared.consoleWindow?.layoutIfNeeded()
FrameRateRequest().perform(duration: 1.5)
if isActive {
UIViewPropertyAnimator(duration: 0.75, dampingRatio: 1) {
@@ -201,6 +203,8 @@ class ResizeController {
static let kMinConsoleHeight: CGFloat = 108
static let kMaxConsoleHeight: CGFloat = 346
let verticalPanner_frameRateRequest = FrameRateRequest()
@objc func verticalPanner(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translation(in: bottomGrabber.superview)
@@ -210,6 +214,8 @@ class ResizeController {
switch recognizer.state {
case .began:
verticalPanner_frameRateRequest.isActive = true
initialHeight = LCManager.shared.consoleSize.height
UIViewPropertyAnimator(duration: 0.4, dampingRatio: 1) { [self] in
@@ -241,6 +247,10 @@ class ResizeController {
LCManager.shared.consoleView.center.y = consoleCenterPoint.y
case .ended, .cancelled:
verticalPanner_frameRateRequest.isActive = false
FrameRateRequest().perform(duration: 0.4)
UIViewPropertyAnimator(duration: 0.4, dampingRatio: 0.7) {
if LCManager.shared.consoleSize.height > maxHeight {
LCManager.shared.consoleSize.height = maxHeight
@@ -270,6 +280,8 @@ class ResizeController {
static let kMinConsoleWidth: CGFloat = 112
static let kMaxConsoleWidth: CGFloat = UIScreen.portraitSize.width - 56
let horizontalPanner_frameRateRequest = FrameRateRequest()
@objc func horizontalPanner(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translation(in: bottomGrabber.superview)
@@ -279,6 +291,8 @@ class ResizeController {
switch recognizer.state {
case .began:
horizontalPanner_frameRateRequest.isActive = true
initialWidth = LCManager.shared.consoleSize.width
UIViewPropertyAnimator(duration: 0.4, dampingRatio: 1) { [self] in
@@ -310,6 +324,10 @@ class ResizeController {
case .ended, .cancelled:
horizontalPanner_frameRateRequest.isActive = false
FrameRateRequest().perform(duration: 0.4)
UIViewPropertyAnimator(duration: 0.4, dampingRatio: 0.7) {
if LCManager.shared.consoleSize.width > maxWidth {
LCManager.shared.consoleSize.width = maxWidth