mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			110 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Swift
		
	
| 
											3 years ago
										 | // Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. | ||
|  | 
 | ||
|  | import UIKit | ||
|  | import SessionUIKit | ||
|  | 
 | ||
|  | public extension UIViewController { | ||
|  |     func findFrontmostViewController(ignoringAlerts: Bool) -> UIViewController { | ||
|  |         var visitedViewControllers: [UIViewController] = [] | ||
|  |          | ||
|  |         var viewController: UIViewController = self | ||
|  |          | ||
|  |         while true { | ||
|  |             visitedViewControllers.append(viewController) | ||
|  |              | ||
|  |             var nextViewController: UIViewController? = viewController.presentedViewController | ||
|  |              | ||
|  |             if let nextViewController: UIViewController = nextViewController { | ||
|  |                 if !ignoringAlerts || !(nextViewController is UIAlertController) { | ||
|  |                     if visitedViewControllers.contains(nextViewController) { | ||
|  |                         // Cycle detected | ||
|  |                         return viewController | ||
|  |                     } | ||
|  |                      | ||
|  |                     viewController = nextViewController | ||
|  |                     continue | ||
|  |                 } | ||
|  |             } | ||
|  |              | ||
|  |             if let navController: UINavigationController = viewController as? UINavigationController { | ||
|  |                 nextViewController = navController.topViewController | ||
|  |                  | ||
|  |                 if let nextViewController: UIViewController = nextViewController { | ||
|  |                     if !ignoringAlerts || !(nextViewController is UIAlertController) { | ||
|  |                         if visitedViewControllers.contains(nextViewController) { | ||
|  |                             // Cycle detected | ||
|  |                             return viewController | ||
|  |                         } | ||
|  |                          | ||
|  |                         viewController = nextViewController | ||
|  |                         continue | ||
|  |                     } | ||
|  |                 } | ||
|  |                  | ||
|  |                 break | ||
|  |             } | ||
|  |              | ||
|  |             break | ||
|  |         } | ||
|  |          | ||
|  |         return viewController | ||
|  |     } | ||
|  |      | ||
|  |     func createOWSBackButton() -> UIBarButtonItem { | ||
|  |         return UIViewController.createOWSBackButton(target: self, selector: #selector(backButtonPressed)) | ||
|  |     } | ||
|  |      | ||
|  |     static func createOWSBackButton(target: Any?, selector: Selector) -> UIBarButtonItem { | ||
|  |         let backButton: UIButton = UIButton(type: .custom) | ||
|  |          | ||
|  |         let isRTL: Bool = CurrentAppContext().isRTL | ||
|  | 
 | ||
|  |         // Nudge closer to the left edge to match default back button item. | ||
|  |         let extraLeftPadding: CGFloat = (isRTL ? 0 : -8) | ||
|  | 
 | ||
|  |         // Give some extra hit area to the back button. This is a little smaller | ||
|  |         // than the default back button, but makes sense for our left aligned title | ||
|  |         // view in the MessagesViewController | ||
|  |         let extraRightPadding: CGFloat = (isRTL ? -0 : 10) | ||
|  | 
 | ||
|  |         // Extra hit area above/below | ||
|  |         let extraHeightPadding: CGFloat = 8 | ||
|  | 
 | ||
|  |         // Matching the default backbutton placement is tricky. | ||
|  |         // We can't just adjust the imageEdgeInsets on a UIBarButtonItem directly, | ||
|  |         // so we adjust the imageEdgeInsets on a UIButton, then wrap that | ||
|  |         // in a UIBarButtonItem. | ||
|  |         backButton.addTarget(target, action: selector, for: .touchUpInside) | ||
|  |          | ||
|  |         let config: UIImage.Configuration = UIImage.SymbolConfiguration(pointSize: 22, weight: .medium) | ||
|  |         backButton.setImage( | ||
|  |             UIImage(systemName: "chevron.backward", withConfiguration: config)? | ||
|  |                 .withRenderingMode(.alwaysTemplate), | ||
|  |             for: .normal | ||
|  |         ) | ||
|  |         backButton.themeTintColor = .textPrimary | ||
|  |         backButton.contentHorizontalAlignment = .left | ||
|  |         backButton.imageEdgeInsets = UIEdgeInsets(top: 0, leading: extraLeftPadding, bottom: 0, trailing: 0) | ||
|  |         backButton.frame = CGRect( | ||
|  |             x: 0, | ||
|  |             y: 0, | ||
|  |             width: ((backButton.image(for: .normal)?.size.width ?? 0) + extraRightPadding), | ||
|  |             height: ((backButton.image(for: .normal)?.size.height ?? 0) + extraHeightPadding) | ||
|  |         ) | ||
|  | 
 | ||
|  |         let backItem: UIBarButtonItem = UIBarButtonItem( | ||
|  |             customView: backButton, | ||
|  |             accessibilityIdentifier: "\(type(of: self)).back" | ||
|  |         ) | ||
|  |         backItem.width = backButton.frame.width | ||
|  | 
 | ||
|  |         return backItem; | ||
|  |     } | ||
|  |      | ||
|  |     // MARK: - Event Handling | ||
|  | 
 | ||
|  |     @objc func backButtonPressed() { | ||
|  |         self.navigationController?.popViewController(animated: true) | ||
|  |     } | ||
|  | } |