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.
126 lines
4.5 KiB
Objective-C
126 lines
4.5 KiB
Objective-C
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
#import "Theme.h"
|
|
#import "UIColor+OWS.h"
|
|
#import "UIView+OWS.h"
|
|
#import "UIViewController+OWS.h"
|
|
#import <SignalCoreKit/iOSVersions.h>
|
|
#import <SignalServiceKit/AppContext.h>
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
@implementation UIViewController (OWS)
|
|
|
|
- (UIViewController *)findFrontmostViewController:(BOOL)ignoringAlerts
|
|
{
|
|
UIViewController *viewController = self;
|
|
while (YES) {
|
|
UIViewController *_Nullable nextViewController = viewController.presentedViewController;
|
|
if (nextViewController) {
|
|
if (ignoringAlerts) {
|
|
if ([nextViewController isKindOfClass:[UIAlertController class]]) {
|
|
break;
|
|
}
|
|
}
|
|
viewController = nextViewController;
|
|
} else if ([viewController isKindOfClass:[UINavigationController class]]) {
|
|
UINavigationController *navigationController = (UINavigationController *)viewController;
|
|
if (navigationController.topViewController) {
|
|
viewController = navigationController.topViewController;
|
|
} else {
|
|
break;
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return viewController;
|
|
}
|
|
|
|
- (UIBarButtonItem *)createOWSBackButton
|
|
{
|
|
return [self createOWSBackButtonWithTarget:self selector:@selector(backButtonPressed:)];
|
|
}
|
|
|
|
- (UIBarButtonItem *)createOWSBackButtonWithTarget:(id)target selector:(SEL)selector
|
|
{
|
|
return [[self class] createOWSBackButtonWithTarget:target selector:selector];
|
|
}
|
|
|
|
+ (UIBarButtonItem *)createOWSBackButtonWithTarget:(id)target selector:(SEL)selector
|
|
{
|
|
OWSAssertDebug(target);
|
|
OWSAssertDebug(selector);
|
|
|
|
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
BOOL isRTL = CurrentAppContext().isRTL;
|
|
|
|
// Nudge closer to the left edge to match default back button item.
|
|
const CGFloat kExtraLeftPadding = 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
|
|
const CGFloat kExtraRightPadding = isRTL ? -0 : +10;
|
|
|
|
// Extra hit area above/below
|
|
const CGFloat kExtraHeightPadding = 4;
|
|
|
|
// 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 forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
UIImage *backImage = [[UIImage imageNamed:(isRTL ? @"NavBarBackRTL" : @"NavBarBack")]
|
|
imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
|
OWSAssertDebug(backImage);
|
|
[backButton setImage:backImage forState:UIControlStateNormal];
|
|
backButton.tintColor = Theme.navbarIconColor;
|
|
|
|
backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
|
|
|
|
// Default back button is 1.5 pixel lower than our extracted image.
|
|
const CGFloat kTopInsetPadding = 1.5;
|
|
backButton.imageEdgeInsets = UIEdgeInsetsMake(kTopInsetPadding, kExtraLeftPadding, 0, 0);
|
|
|
|
CGRect buttonFrame
|
|
= CGRectMake(0, 0, backImage.size.width + kExtraRightPadding, backImage.size.height + kExtraHeightPadding);
|
|
backButton.frame = buttonFrame;
|
|
|
|
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(11, 1)) {
|
|
// In iOS 11.1 beta, the hot area of custom bar button items is _only_
|
|
// the bounds of the custom view, making them very hard to hit.
|
|
//
|
|
// TODO: Remove this hack if the bug is fixed in iOS 11.1 by the time
|
|
// it goes to production (or in a later release),
|
|
// since it has two negative side effects: 1) the layout of the
|
|
// back button isn't consistent with the iOS default back buttons
|
|
// 2) we can't add the unread count badge to the back button
|
|
// with this hack.
|
|
return [[UIBarButtonItem alloc] initWithImage:backImage
|
|
style:UIBarButtonItemStylePlain
|
|
target:target
|
|
action:selector];
|
|
}
|
|
|
|
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
|
|
backItem.width = buttonFrame.size.width;
|
|
|
|
return backItem;
|
|
}
|
|
|
|
#pragma mark - Event Handling
|
|
|
|
- (void)backButtonPressed:(id)sender
|
|
{
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
|
|
@end
|
|
|
|
NS_ASSUME_NONNULL_END
|