mirror of
https://github.com/viq/NewsBlur.git
synced 2025-08-31 22:20:12 +00:00
iOS: Fix popover interaction with keyboard support.
Use the same popover creation code in more places, which adds Escape and Command-. to dismiss popovers. Ensure that popovers both get and can accept first responder, preventing keyboard input from leaking through to an underlying view controller. Without this, it can be confusing as, for example, you can navigate to a different story while you’ve got a ‘mark read’ popover shown for another story.
This commit is contained in:
parent
fadc460421
commit
f01ec1c008
11 changed files with 81 additions and 33 deletions
|
@ -93,6 +93,11 @@
|
|||
return YES;
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (IBAction)doLogout:(id)sender {
|
||||
[appDelegate confirmLogout];
|
||||
}
|
||||
|
|
|
@ -91,6 +91,11 @@
|
|||
return YES;
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark - Table view data source
|
||||
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
|
||||
self.menuTableView.backgroundColor = UIColorFromRGB(0xECEEEA);
|
||||
self.menuTableView.separatorColor = UIColorFromRGB(0x909090);
|
||||
self.modalPresentationStyle = UIModalPresentationPopover;
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
|
@ -117,6 +116,11 @@
|
|||
return YES;
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)debugOutputFontNames {
|
||||
NSLog(@"Debugging font names");
|
||||
for (NSString *family in [[UIFont familyNames] sortedArrayUsingSelector:@selector(compare:)]) {
|
||||
|
|
|
@ -62,6 +62,11 @@ typedef NS_ENUM(NSUInteger, MarkReadMenuOlderNewerMode)
|
|||
}
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (CGSize)preferredContentSize {
|
||||
CGSize size = CGSizeMake(300.0, 190.0);
|
||||
|
||||
|
|
|
@ -55,6 +55,11 @@ NSString * const MenuHandler = @"handler";
|
|||
self.menuTableView.scrollEnabled = self.preferredContentSize.height > self.view.frame.size.height;
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (CGSize)preferredContentSize {
|
||||
CGSize size = CGSizeMake(100.0, 0.0);
|
||||
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:14.0];
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#import "NBActivityItemProvider.h"
|
||||
#import "NSNull+JSON.h"
|
||||
#import "UISearchBar+Field.h"
|
||||
#import "UIViewController+HidePopover.h"
|
||||
#import <float.h>
|
||||
|
||||
@interface NewsBlurAppDelegate () <UIViewControllerTransitioningDelegate>
|
||||
|
@ -2146,20 +2147,8 @@
|
|||
self.markReadMenuViewController.olderNewerStory = olderNewerStory;
|
||||
self.markReadMenuViewController.extraItems = extraItems;
|
||||
self.markReadMenuViewController.completionHandler = completionHandler;
|
||||
|
||||
UIPopoverPresentationController *popoverPresentationController = self.markReadMenuViewController.popoverPresentationController;
|
||||
popoverPresentationController.delegate = self;
|
||||
popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
popoverPresentationController.backgroundColor = UIColorFromRGB(NEWSBLUR_WHITE_COLOR);
|
||||
|
||||
if (barButtonItem) {
|
||||
popoverPresentationController.barButtonItem = barButtonItem;
|
||||
} else {
|
||||
popoverPresentationController.sourceView = sourceView;
|
||||
popoverPresentationController.sourceRect = sourceRect;
|
||||
}
|
||||
|
||||
[self.navigationController presentViewController:self.markReadMenuViewController animated:YES completion:nil];
|
||||
|
||||
[self showPopoverWithViewController:self.markReadMenuViewController contentSize:CGSizeZero barButtonItem:barButtonItem sourceView:sourceView sourceRect:sourceRect permittedArrowDirections:UIPopoverArrowDirectionAny];
|
||||
}
|
||||
|
||||
- (void)showPopoverWithViewController:(UIViewController *)viewController contentSize:(CGSize)contentSize barButtonItem:(UIBarButtonItem *)barButtonItem {
|
||||
|
@ -2183,7 +2172,9 @@
|
|||
|
||||
viewController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
viewController.preferredContentSize = contentSize;
|
||||
|
||||
[viewController addKeyCommand:[UIKeyCommand keyCommandWithInput:@"." modifierFlags:UIKeyModifierCommand action:@selector(hidePopover)]];
|
||||
[viewController addKeyCommand:[UIKeyCommand keyCommandWithInput:UIKeyInputEscape modifierFlags:0 action:@selector(hidePopover)]];
|
||||
|
||||
UIPopoverPresentationController *popoverPresentationController = viewController.popoverPresentationController;
|
||||
popoverPresentationController.delegate = self;
|
||||
popoverPresentationController.backgroundColor = UIColorFromRGB(NEWSBLUR_WHITE_COLOR);
|
||||
|
@ -2198,6 +2189,8 @@
|
|||
|
||||
[self.navigationControllerForPopover presentViewController:viewController animated:YES completion:^{
|
||||
popoverPresentationController.passthroughViews = nil;
|
||||
// NSLog(@"%@ canBecomeFirstResponder? %d", viewController, viewController.canBecomeFirstResponder);
|
||||
[viewController becomeFirstResponder];
|
||||
}];
|
||||
}
|
||||
|
||||
|
|
|
@ -1147,17 +1147,10 @@
|
|||
|
||||
|
||||
- (IBAction)toggleFontSize:(id)sender {
|
||||
[self.appDelegate.fontSettingsNavigationController popToRootViewControllerAnimated:NO];
|
||||
self.appDelegate.fontSettingsNavigationController.modalPresentationStyle = UIModalPresentationPopover;
|
||||
UIPopoverPresentationController *popPC = self.appDelegate.fontSettingsNavigationController.popoverPresentationController;
|
||||
popPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
|
||||
popPC.backgroundColor = UIColorFromRGB(NEWSBLUR_WHITE_COLOR);
|
||||
popPC.delegate = self;
|
||||
popPC.barButtonItem = self.fontSettingsButton;
|
||||
// popPC.sourceView = self.view;
|
||||
// popPC.sourceRect = [sender frame];
|
||||
|
||||
[self presentViewController:self.appDelegate.fontSettingsNavigationController animated:YES completion:nil];
|
||||
UINavigationController *fontSettingsNavigationController = self.appDelegate.fontSettingsNavigationController;
|
||||
|
||||
[fontSettingsNavigationController popToRootViewControllerAnimated:NO];
|
||||
[self.appDelegate showPopoverWithViewController:fontSettingsNavigationController contentSize:CGSizeZero barButtonItem:self.fontSettingsButton];
|
||||
}
|
||||
|
||||
- (void)setFontStyle:(NSString *)fontStyle {
|
||||
|
@ -1274,10 +1267,4 @@
|
|||
}
|
||||
}
|
||||
|
||||
#pragma mark - UIPopoverPresentationControllerDelegate
|
||||
|
||||
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
|
||||
return UIModalPresentationNone;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -89,6 +89,11 @@
|
|||
[self.profileTable reloadData];
|
||||
}
|
||||
|
||||
// allow keyboard comands
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)doCancelButton {
|
||||
[appDelegate.modalNavigationController dismissViewControllerAnimated:NO completion:nil];
|
||||
}
|
||||
|
|
|
@ -213,6 +213,7 @@
|
|||
784B50ED127E3F68008F90EA /* LoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 784B50EB127E3F68008F90EA /* LoginViewController.m */; };
|
||||
787A0CDB11CE65330056422D /* FeedDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 787A0CD911CE65330056422D /* FeedDetailViewController.m */; };
|
||||
788EF356127E5BC80088EDC5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 788EF355127E5BC80088EDC5 /* QuartzCore.framework */; };
|
||||
E160F0571C9DAC2C00CB96DF /* UIViewController+HidePopover.m in Sources */ = {isa = PBXBuildFile; fileRef = E160F0561C9DAC2C00CB96DF /* UIViewController+HidePopover.m */; };
|
||||
E1D123FE1C66753D00434F40 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = E1D123FD1C66753D00434F40 /* Localizable.stringsdict */; };
|
||||
FF03AFE419F87A770063002A /* g_icn_folder_read.png in Resources */ = {isa = PBXBuildFile; fileRef = FF03AFE219F87A770063002A /* g_icn_folder_read.png */; };
|
||||
FF03AFE519F87A770063002A /* g_icn_folder_read@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF03AFE319F87A770063002A /* g_icn_folder_read@2x.png */; };
|
||||
|
@ -806,6 +807,8 @@
|
|||
787A0CD911CE65330056422D /* FeedDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = FeedDetailViewController.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||
788EF355127E5BC80088EDC5 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||
8D1107310486CEB800E47090 /* NewsBlur-iPhone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "NewsBlur-iPhone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
|
||||
E160F0551C9DAC2C00CB96DF /* UIViewController+HidePopover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+HidePopover.h"; path = "Other Sources/UIViewController+HidePopover.h"; sourceTree = "<group>"; };
|
||||
E160F0561C9DAC2C00CB96DF /* UIViewController+HidePopover.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+HidePopover.m"; path = "Other Sources/UIViewController+HidePopover.m"; sourceTree = "<group>"; };
|
||||
E1D123FD1C66753D00434F40 /* Localizable.stringsdict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.stringsdict; path = Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
FF03AFE219F87A770063002A /* g_icn_folder_read.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = g_icn_folder_read.png; sourceTree = "<group>"; };
|
||||
FF03AFE319F87A770063002A /* g_icn_folder_read@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "g_icn_folder_read@2x.png"; sourceTree = "<group>"; };
|
||||
|
@ -1429,6 +1432,8 @@
|
|||
43A4C3D615B00966008787B5 /* UIView+TKCategory.m */,
|
||||
FFA0484219CA73B700618DC4 /* UIView+ViewController.h */,
|
||||
FFA0484319CA73B700618DC4 /* UIView+ViewController.m */,
|
||||
E160F0551C9DAC2C00CB96DF /* UIViewController+HidePopover.h */,
|
||||
E160F0561C9DAC2C00CB96DF /* UIViewController+HidePopover.m */,
|
||||
FF4151BE16DED9660013E84B /* UIBarButtonItem+Image.h */,
|
||||
FF4151BF16DED9660013E84B /* UIBarButtonItem+Image.m */,
|
||||
17C495491C129863004805A7 /* UISearchBar+Field.h */,
|
||||
|
@ -2929,6 +2934,7 @@
|
|||
FF2EB7BA1AA65504002549A7 /* IASKPSSliderSpecifierViewCell.m in Sources */,
|
||||
43CE0F5F15DADB7F00608ED8 /* SiteCell.m in Sources */,
|
||||
FFA045B419CA49D700618DC4 /* SloppySwiper.m in Sources */,
|
||||
E160F0571C9DAC2C00CB96DF /* UIViewController+HidePopover.m in Sources */,
|
||||
FFDE35CC161B8F870034BFDE /* FolderTitleView.m in Sources */,
|
||||
FFDE35DA161D12250034BFDE /* UnreadCountView.m in Sources */,
|
||||
FFDE35EA162799B90034BFDE /* FeedDetailMenuViewController.m in Sources */,
|
||||
|
|
15
clients/ios/Other Sources/UIViewController+HidePopover.h
Normal file
15
clients/ios/Other Sources/UIViewController+HidePopover.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
//
|
||||
// UIViewController+HidePopover.h
|
||||
// NewsBlur
|
||||
//
|
||||
// Created by Nicholas Riley on 3/19/16.
|
||||
// Copyright © 2016 NewsBlur. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface UIViewController (HidePopover)
|
||||
|
||||
- (void)hidePopover;
|
||||
|
||||
@end
|
18
clients/ios/Other Sources/UIViewController+HidePopover.m
Normal file
18
clients/ios/Other Sources/UIViewController+HidePopover.m
Normal file
|
@ -0,0 +1,18 @@
|
|||
//
|
||||
// UIViewController+Dismiss.m
|
||||
// NewsBlur
|
||||
//
|
||||
// Created by Nicholas Riley on 3/19/16.
|
||||
// Copyright © 2016 NewsBlur. All rights reserved.
|
||||
//
|
||||
|
||||
#import "UIViewController+HidePopover.h"
|
||||
#import "NewsBlurAppDelegate.h"
|
||||
|
||||
@implementation UIViewController (HidePopover)
|
||||
|
||||
- (void)hidePopover {
|
||||
[(NewsBlurAppDelegate *)[UIApplication sharedApplication].delegate hidePopover];
|
||||
}
|
||||
|
||||
@end
|
Loading…
Add table
Reference in a new issue