From caf80431f581e6bc161f0e1d9ba2ffc9dcba296d Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Tue, 4 Nov 2014 12:15:49 -0800 Subject: [PATCH] Swapping WYPopoverController for old-looking WEPopover. --- .../ios/Classes/FeedDetailViewController.h | 8 +- .../ios/Classes/FeedDetailViewController.m | 52 +-- clients/ios/Classes/NewsBlurViewController.h | 8 +- clients/ios/Classes/NewsBlurViewController.m | 63 +-- clients/ios/Classes/StoryPageControl.h | 8 +- clients/ios/Classes/StoryPageControl.m | 52 +-- .../ios/NewsBlur.xcodeproj/project.pbxproj | 38 +- .../ios/Popover/UIBarButtonItem+WEPopover.h | 18 - .../ios/Popover/UIBarButtonItem+WEPopover.m | 46 --- clients/ios/Popover/WEPopoverContainerView.h | 100 ----- clients/ios/Popover/WEPopoverContainerView.m | 366 ----------------- clients/ios/Popover/WEPopoverController.h | 75 ---- clients/ios/Popover/WEPopoverController.m | 377 ------------------ clients/ios/Popover/WEPopoverParentView.h | 18 - clients/ios/Popover/WETouchableView.h | 37 -- clients/ios/Popover/WETouchableView.m | 70 ---- 16 files changed, 42 insertions(+), 1294 deletions(-) delete mode 100755 clients/ios/Popover/UIBarButtonItem+WEPopover.h delete mode 100755 clients/ios/Popover/UIBarButtonItem+WEPopover.m delete mode 100755 clients/ios/Popover/WEPopoverContainerView.h delete mode 100755 clients/ios/Popover/WEPopoverContainerView.m delete mode 100755 clients/ios/Popover/WEPopoverController.h delete mode 100755 clients/ios/Popover/WEPopoverController.m delete mode 100755 clients/ios/Popover/WEPopoverParentView.h delete mode 100755 clients/ios/Popover/WETouchableView.h delete mode 100755 clients/ios/Popover/WETouchableView.m diff --git a/clients/ios/Classes/FeedDetailViewController.h b/clients/ios/Classes/FeedDetailViewController.h index 38bfd4ef3..ab0efb17e 100644 --- a/clients/ios/Classes/FeedDetailViewController.h +++ b/clients/ios/Classes/FeedDetailViewController.h @@ -11,7 +11,7 @@ #import "ASIHTTPRequest.h" #import "BaseViewController.h" #import "Utilities.h" -#import "WEPopoverController.h" +#import "WYPopoverController.h" #import "NBNotifier.h" #import "MCSwipeTableViewCell.h" @@ -23,7 +23,7 @@ { NewsBlurAppDelegate *appDelegate; @@ -38,7 +38,7 @@ UITableView * storyTitlesTable; UIBarButtonItem * feedMarkReadButton; - WEPopoverController *popoverController; + WYPopoverController *popoverController; Class popoverClass; NBNotifier *notifier; } @@ -51,7 +51,7 @@ @property (nonatomic) IBOutlet UIBarButtonItem * spacer2BarButton; @property (nonatomic) IBOutlet UIBarButtonItem * separatorBarButton; @property (nonatomic) IBOutlet UIBarButtonItem * titleImageBarButton; -@property (nonatomic, retain) WEPopoverController *popoverController; +@property (nonatomic, retain) WYPopoverController *popoverController; @property (nonatomic, retain) NBNotifier *notifier; @property (nonatomic, retain) StoriesCollection *storiesCollection; diff --git a/clients/ios/Classes/FeedDetailViewController.m b/clients/ios/Classes/FeedDetailViewController.m index a92698216..fd772efa1 100644 --- a/clients/ios/Classes/FeedDetailViewController.m +++ b/clients/ios/Classes/FeedDetailViewController.m @@ -21,8 +21,7 @@ #import "JSON.h" #import "StringHelper.h" #import "Utilities.h" -#import "UIBarButtonItem+WEPopover.h" -#import "WEPopoverController.h" +#import "WYPopoverController.h" #import "UIBarButtonItem+Image.h" #import "FeedDetailMenuViewController.h" #import "NBNotifier.h" @@ -85,7 +84,7 @@ name:UIContentSizeCategoryDidChangeNotification object:nil]; - popoverClass = [WEPopoverController class]; + popoverClass = [WYPopoverController class]; self.storyTitlesTable.backgroundColor = UIColorFromRGB(0xf4f4f4); self.storyTitlesTable.separatorColor = UIColorFromRGB(0xE9E8E4); @@ -1739,7 +1738,7 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state [appDelegate.masterContainerViewController showFeedDetailMenuPopover:self.settingsBarButton]; } else { if (self.popoverController == nil) { - self.popoverController = [[WEPopoverController alloc] + self.popoverController = [[WYPopoverController alloc] initWithContentViewController:(UIViewController *)appDelegate.feedDetailMenuViewController]; [appDelegate.feedDetailMenuViewController buildMenuOptions]; self.popoverController.delegate = self; @@ -1748,9 +1747,6 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state self.popoverController = nil; } - if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) { - [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]]; - } NSInteger menuCount = [appDelegate.feedDetailMenuViewController.menuOptions count] + 2; [self.popoverController setPopoverContentSize:CGSizeMake(260, 38 * menuCount)]; [self.popoverController presentPopoverFromBarButtonItem:self.settingsBarButton @@ -2023,52 +2019,16 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state } #pragma mark - -#pragma mark WEPopoverControllerDelegate implementation +#pragma mark WYPopoverControllerDelegate implementation -- (void)popoverControllerDidDismissPopover:(WEPopoverController *)thePopoverController { +- (void)popoverControllerDidDismissPopover:(WYPopoverController *)thePopoverController { //Safe to release the popover here self.popoverController = nil; } -- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)thePopoverController { +- (BOOL)popoverControllerShouldDismissPopover:(WYPopoverController *)thePopoverController { //The popover is automatically dismissed if you click outside it, unless you return NO here return YES; } -- (WEPopoverContainerViewProperties *)improvedContainerViewProperties { - - WEPopoverContainerViewProperties *props = [WEPopoverContainerViewProperties alloc]; - NSString *bgImageName = nil; - CGFloat bgMargin = 0.0; - CGFloat bgCapSize = 0.0; - CGFloat contentMargin = 5.0; - - bgImageName = @"popoverBg.png"; - - // These constants are determined by the popoverBg.png image file and are image dependent - bgMargin = 13; // margin width of 13 pixels on all sides popoverBg.png (62 pixels wide - 36 pixel background) / 2 == 26 / 2 == 13 - bgCapSize = 31; // ImageSize/2 == 62 / 2 == 31 pixels - - props.leftBgMargin = bgMargin; - props.rightBgMargin = bgMargin; - props.topBgMargin = bgMargin; - props.bottomBgMargin = bgMargin; - props.leftBgCapSize = bgCapSize; - props.topBgCapSize = bgCapSize; - props.bgImageName = bgImageName; - props.leftContentMargin = contentMargin; - props.rightContentMargin = contentMargin - 1; // Need to shift one pixel for border to look correct - props.topContentMargin = contentMargin; - props.bottomContentMargin = contentMargin; - - props.arrowMargin = 4.0; - - props.upArrowImageName = @"popoverArrowUp.png"; - props.downArrowImageName = @"popoverArrowDown.png"; - props.leftArrowImageName = @"popoverArrowLeft.png"; - props.rightArrowImageName = @"popoverArrowRight.png"; - return props; -} - - @end diff --git a/clients/ios/Classes/NewsBlurViewController.h b/clients/ios/Classes/NewsBlurViewController.h index 132a4dfbe..5a5463e08 100644 --- a/clients/ios/Classes/NewsBlurViewController.h +++ b/clients/ios/Classes/NewsBlurViewController.h @@ -12,7 +12,7 @@ #import "ASIHTTPRequest.h" #import "PullToRefreshView.h" #import "BaseViewController.h" -#import "WEPopoverController.h" +#import "WYPopoverController.h" #import "NBNotifier.h" #import "IASKAppSettingsViewController.h" #import "MCSwipeTableViewCell.h" @@ -23,7 +23,7 @@ { UIBarButtonItem * settingsBarButton; UIBarButtonItem * activitiesButton; UISegmentedControl * intelligenceControl; - WEPopoverController *popoverController; + WYPopoverController *popoverController; Class popoverClass; NBNotifier *notifier; } @@ -81,7 +81,7 @@ UIActionSheetDelegate> { @property (nonatomic) NSDate *lastUpdate; @property (nonatomic) NSCache *imageCache; @property (nonatomic) IBOutlet UISegmentedControl * intelligenceControl; -@property (nonatomic, retain) WEPopoverController *popoverController; +@property (nonatomic, retain) WYPopoverController *popoverController; @property (nonatomic) NSIndexPath *currentRowAtIndexPath; @property (nonatomic) NSInteger currentSection; @property (strong, nonatomic) IBOutlet UIView *noFocusMessage; diff --git a/clients/ios/Classes/NewsBlurViewController.m b/clients/ios/Classes/NewsBlurViewController.m index ecc636cfe..312126ab3 100644 --- a/clients/ios/Classes/NewsBlurViewController.m +++ b/clients/ios/Classes/NewsBlurViewController.m @@ -26,7 +26,6 @@ #import "JSON.h" #import "NBNotifier.h" #import "Utilities.h" -#import "UIBarButtonItem+WEPopover.h" #import "UIBarButtonItem+Image.h" #import "AddSiteViewController.h" #import "FMDatabase.h" @@ -100,7 +99,7 @@ static UIFont *userLabelFont; - (void)viewDidLoad { [super viewDidLoad]; - popoverClass = [WEPopoverController class]; + popoverClass = [WYPopoverController class]; pull = [[PullToRefreshView alloc] initWithScrollView:self.feedTitlesTable]; [pull setDelegate:self]; @@ -816,7 +815,7 @@ static UIFont *userLabelFont; [appDelegate.masterContainerViewController showSitePopover:self.addBarButton]; } else { if (self.popoverController == nil) { - self.popoverController = [[WEPopoverController alloc] + self.popoverController = [[WYPopoverController alloc] initWithContentViewController:appDelegate.addSiteViewController]; self.popoverController.delegate = self; @@ -825,9 +824,6 @@ static UIFont *userLabelFont; self.popoverController = nil; } - if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) { - [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]]; - } [self.popoverController setPopoverContentSize:CGSizeMake(self.view.frame.size.width - 36, self.view.frame.size.height - 28)]; [self.popoverController presentPopoverFromBarButtonItem:self.addBarButton @@ -843,7 +839,7 @@ static UIFont *userLabelFont; [appDelegate.masterContainerViewController showFeedMenuPopover:self.settingsBarButton]; } else { if (self.popoverController == nil) { - self.popoverController = [[WEPopoverController alloc] + self.popoverController = [[WYPopoverController alloc] initWithContentViewController:appDelegate.feedsMenuViewController]; self.popoverController.delegate = self; @@ -852,9 +848,6 @@ static UIFont *userLabelFont; self.popoverController = nil; } - if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) { - [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]]; - } [appDelegate.feedsMenuViewController view]; // Force viewDidLoad [self.popoverController setPopoverContentSize:CGSizeMake(200, 38 * [appDelegate.feedsMenuViewController.menuOptions count])]; [self.popoverController presentPopoverFromBarButtonItem:self.settingsBarButton @@ -865,7 +858,7 @@ static UIFont *userLabelFont; - (IBAction)showInteractionsPopover:(id)sender { if (self.popoverController == nil) { - self.popoverController = [[WEPopoverController alloc] + self.popoverController = [[WYPopoverController alloc] initWithContentViewController:appDelegate.dashboardViewController]; self.popoverController.delegate = self; @@ -874,9 +867,6 @@ static UIFont *userLabelFont; self.popoverController = nil; } - if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) { - [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]]; - } [self.popoverController setPopoverContentSize:CGSizeMake(self.view.frame.size.width - 36, self.view.frame.size.height - 60)]; [self.popoverController presentPopoverFromBarButtonItem:self.activitiesButton @@ -1852,57 +1842,18 @@ heightForHeaderInSection:(NSInteger)section { } #pragma mark - -#pragma mark WEPopoverControllerDelegate implementation +#pragma mark WYPopoverControllerDelegate implementation -- (void)popoverControllerDidDismissPopover:(WEPopoverController *)thePopoverController { +- (void)popoverControllerDidDismissPopover:(WYPopoverController *)thePopoverController { //Safe to release the popover here self.popoverController = nil; } -- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)thePopoverController { +- (BOOL)popoverControllerShouldDismissPopover:(WYPopoverController *)thePopoverController { //The popover is automatically dismissed if you click outside it, unless you return NO here return YES; } - -/** - Thanks to Paul Solt for supplying these background images and container view properties - */ -- (WEPopoverContainerViewProperties *)improvedContainerViewProperties { - - WEPopoverContainerViewProperties *props = [WEPopoverContainerViewProperties alloc]; - NSString *bgImageName = nil; - CGFloat bgMargin = 0.0; - CGFloat bgCapSize = 0.0; - CGFloat contentMargin = 0.0; - - bgImageName = @"popoverBg.png"; - - // These constants are determined by the popoverBg.png image file and are image dependent - bgMargin = 13; // margin width of 13 pixels on all sides popoverBg.png (62 pixels wide - 36 pixel background) / 2 == 26 / 2 == 13 - bgCapSize = 31; // ImageSize/2 == 62 / 2 == 31 pixels - - props.leftBgMargin = bgMargin; - props.rightBgMargin = bgMargin; - props.topBgMargin = bgMargin; - props.bottomBgMargin = bgMargin; - props.leftBgCapSize = bgCapSize; - props.topBgCapSize = bgCapSize; - props.bgImageName = bgImageName; - props.leftContentMargin = contentMargin; - props.rightContentMargin = contentMargin - 1; // Need to shift one pixel for border to look correct - props.topContentMargin = contentMargin; - props.bottomContentMargin = contentMargin; - - props.arrowMargin = 4.0; - - props.upArrowImageName = @"popoverArrowUp.png"; - props.downArrowImageName = @"popoverArrowDown.png"; - props.leftArrowImageName = @"popoverArrowLeft.png"; - props.rightArrowImageName = @"popoverArrowRight.png"; - return props; -} - - (void)resetToolbar { self.navigationItem.leftBarButtonItem = nil; self.navigationItem.titleView = nil; diff --git a/clients/ios/Classes/StoryPageControl.h b/clients/ios/Classes/StoryPageControl.h index 8f96a6689..ecb644011 100644 --- a/clients/ios/Classes/StoryPageControl.h +++ b/clients/ios/Classes/StoryPageControl.h @@ -9,14 +9,14 @@ #import #import "BaseViewController.h" #import "NewsBlurAppDelegate.h" -#import "WEPopoverController.h" +#import "WYPopoverController.h" #import "THCircularProgressView.h" @class NewsBlurAppDelegate; @class ASIHTTPRequest; @interface StoryPageControl : BaseViewController - { + { NewsBlurAppDelegate *appDelegate; @@ -30,7 +30,7 @@ UIView *progressView; UIView *progressViewContainer; - WEPopoverController *popoverController; + WYPopoverController *popoverController; Class popoverClass; BOOL isDraggingScrollview; @@ -74,7 +74,7 @@ @property (nonatomic) MBProgressHUD *storyHUD; @property (nonatomic) NSInteger scrollingToPage; -@property (nonatomic, strong) WEPopoverController *popoverController; +@property (nonatomic, strong) WYPopoverController *popoverController; - (void)resizeScrollView; - (void)applyNewIndex:(NSInteger)newIndex pageController:(StoryDetailViewController *)pageController; diff --git a/clients/ios/Classes/StoryPageControl.m b/clients/ios/Classes/StoryPageControl.m index ea1c9bf33..4626e54b6 100644 --- a/clients/ios/Classes/StoryPageControl.m +++ b/clients/ios/Classes/StoryPageControl.m @@ -92,7 +92,7 @@ [self.scrollView setShowsHorizontalScrollIndicator:NO]; [self.scrollView setShowsVerticalScrollIndicator:NO]; - popoverClass = [WEPopoverController class]; + popoverClass = [WYPopoverController class]; // adding HUD for progress bar CGFloat radius = 8; @@ -953,7 +953,7 @@ [appDelegate.masterContainerViewController showFontSettingsPopover:self.fontSettingsButton]; } else { if (self.popoverController == nil) { - self.popoverController = [[WEPopoverController alloc] + self.popoverController = [[WYPopoverController alloc] initWithContentViewController:appDelegate.fontSettingsViewController]; self.popoverController.delegate = self; @@ -962,9 +962,6 @@ self.popoverController = nil; } - if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) { - [self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]]; - } [self.popoverController setPopoverContentSize:CGSizeMake(240, 38*8-2)]; [self.popoverController presentPopoverFromBarButtonItem:self.fontSettingsButton permittedArrowDirections:UIPopoverArrowDirectionAny @@ -1063,55 +1060,16 @@ } #pragma mark - -#pragma mark WEPopoverControllerDelegate implementation +#pragma mark WYPopoverControllerDelegate implementation -- (void)popoverControllerDidDismissPopover:(WEPopoverController *)thePopoverController { +- (void)popoverControllerDidDismissPopover:(WYPopoverController *)thePopoverController { //Safe to release the popover here self.popoverController = nil; } -- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)thePopoverController { +- (BOOL)popoverControllerShouldDismissPopover:(WYPopoverController *)thePopoverController { //The popover is automatically dismissed if you click outside it, unless you return NO here return YES; } - -/** - Thanks to Paul Solt for supplying these background images and container view properties - */ -- (WEPopoverContainerViewProperties *)improvedContainerViewProperties { - - WEPopoverContainerViewProperties *props = [WEPopoverContainerViewProperties alloc]; - NSString *bgImageName = nil; - CGFloat bgMargin = 0.0; - CGFloat bgCapSize = 0.0; - CGFloat contentMargin = 5.0; - - bgImageName = @"popoverBg.png"; - - // These constants are determined by the popoverBg.png image file and are image dependent - bgMargin = 13; // margin width of 13 pixels on all sides popoverBg.png (62 pixels wide - 36 pixel background) / 2 == 26 / 2 == 13 - bgCapSize = 31; // ImageSize/2 == 62 / 2 == 31 pixels - - props.leftBgMargin = bgMargin; - props.rightBgMargin = bgMargin; - props.topBgMargin = bgMargin; - props.bottomBgMargin = bgMargin; - props.leftBgCapSize = bgCapSize; - props.topBgCapSize = bgCapSize; - props.bgImageName = bgImageName; - props.leftContentMargin = contentMargin; - props.rightContentMargin = contentMargin - 1; // Need to shift one pixel for border to look correct - props.topContentMargin = contentMargin; - props.bottomContentMargin = contentMargin; - - props.arrowMargin = 4.0; - - props.upArrowImageName = @"popoverArrowUp.png"; - props.downArrowImageName = @"popoverArrowDown.png"; - props.leftArrowImageName = @"popoverArrowLeft.png"; - props.rightArrowImageName = @"popoverArrowRight.png"; - return props; -} - @end diff --git a/clients/ios/NewsBlur.xcodeproj/project.pbxproj b/clients/ios/NewsBlur.xcodeproj/project.pbxproj index 2710abd23..7e4751622 100755 --- a/clients/ios/NewsBlur.xcodeproj/project.pbxproj +++ b/clients/ios/NewsBlur.xcodeproj/project.pbxproj @@ -61,10 +61,6 @@ 43A3914B15B73A7B0074B212 /* AFURLConnectionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A3913F15B73A7B0074B212 /* AFURLConnectionOperation.m */; }; 43A3914C15B73A7B0074B212 /* AFXMLRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A3914115B73A7B0074B212 /* AFXMLRequestOperation.m */; }; 43A3914D15B73A7B0074B212 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A3914315B73A7B0074B212 /* UIImageView+AFNetworking.m */; }; - 43A4BAC815C8663600F3B8D4 /* UIBarButtonItem+WEPopover.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A4BAC015C8663600F3B8D4 /* UIBarButtonItem+WEPopover.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 43A4BAC915C8663600F3B8D4 /* WEPopoverContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A4BAC215C8663600F3B8D4 /* WEPopoverContainerView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 43A4BACA15C8663600F3B8D4 /* WEPopoverController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A4BAC415C8663600F3B8D4 /* WEPopoverController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 43A4BACB15C8663600F3B8D4 /* WETouchableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A4BAC715C8663600F3B8D4 /* WETouchableView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 43A4BADB15C866FA00F3B8D4 /* popoverArrowDown.png in Resources */ = {isa = PBXBuildFile; fileRef = 43A4BACC15C866FA00F3B8D4 /* popoverArrowDown.png */; }; 43A4BADC15C866FA00F3B8D4 /* popoverArrowDown@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 43A4BACD15C866FA00F3B8D4 /* popoverArrowDown@2x.png */; }; 43A4BADD15C866FA00F3B8D4 /* popoverArrowDownSimple.png in Resources */ = {isa = PBXBuildFile; fileRef = 43A4BACE15C866FA00F3B8D4 /* popoverArrowDownSimple.png */; }; @@ -266,6 +262,8 @@ FF6281FA1A09614C00271FDB /* all@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF6281F91A09614C00271FDB /* all@3x.png */; }; FF6281FC1A0962FA00271FDB /* unread_green@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF6281FB1A0962FA00271FDB /* unread_green@3x.png */; }; FF6281FE1A09641100271FDB /* unread_yellow@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF6281FD1A09641100271FDB /* unread_yellow@3x.png */; }; + FF6282031A09685800271FDB /* WYPopoverController.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6282001A09685800271FDB /* WYPopoverController.m */; }; + FF6282041A09685800271FDB /* WYStoryboardPopoverSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6282021A09685800271FDB /* WYStoryboardPopoverSegue.m */; }; FF6618C8176184560039913B /* NBNotifier.m in Sources */ = {isa = PBXBuildFile; fileRef = FF6618C7176184560039913B /* NBNotifier.m */; }; FF67D3B2168924C40057A7DA /* TrainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FF67D3B1168924C40057A7DA /* TrainerViewController.m */; }; FF67D3B7168977690057A7DA /* TrainerViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FF67D3B6168977690057A7DA /* TrainerViewController.xib */; }; @@ -776,15 +774,6 @@ 43A3914115B73A7B0074B212 /* AFXMLRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AFXMLRequestOperation.m; sourceTree = ""; }; 43A3914215B73A7B0074B212 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+AFNetworking.h"; sourceTree = ""; }; 43A3914315B73A7B0074B212 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+AFNetworking.m"; sourceTree = ""; }; - 43A4BABF15C8663600F3B8D4 /* UIBarButtonItem+WEPopover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+WEPopover.h"; sourceTree = ""; }; - 43A4BAC015C8663600F3B8D4 /* UIBarButtonItem+WEPopover.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+WEPopover.m"; sourceTree = ""; }; - 43A4BAC115C8663600F3B8D4 /* WEPopoverContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WEPopoverContainerView.h; sourceTree = ""; }; - 43A4BAC215C8663600F3B8D4 /* WEPopoverContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WEPopoverContainerView.m; sourceTree = ""; }; - 43A4BAC315C8663600F3B8D4 /* WEPopoverController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WEPopoverController.h; sourceTree = ""; }; - 43A4BAC415C8663600F3B8D4 /* WEPopoverController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WEPopoverController.m; sourceTree = ""; }; - 43A4BAC515C8663600F3B8D4 /* WEPopoverParentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WEPopoverParentView.h; sourceTree = ""; }; - 43A4BAC615C8663600F3B8D4 /* WETouchableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WETouchableView.h; sourceTree = ""; }; - 43A4BAC715C8663600F3B8D4 /* WETouchableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WETouchableView.m; sourceTree = ""; }; 43A4BACC15C866FA00F3B8D4 /* popoverArrowDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = popoverArrowDown.png; sourceTree = ""; }; 43A4BACD15C866FA00F3B8D4 /* popoverArrowDown@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "popoverArrowDown@2x.png"; sourceTree = ""; }; 43A4BACE15C866FA00F3B8D4 /* popoverArrowDownSimple.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = popoverArrowDownSimple.png; sourceTree = ""; }; @@ -1053,6 +1042,10 @@ FF6281F91A09614C00271FDB /* all@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "all@3x.png"; sourceTree = ""; }; FF6281FB1A0962FA00271FDB /* unread_green@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unread_green@3x.png"; sourceTree = ""; }; FF6281FD1A09641100271FDB /* unread_yellow@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "unread_yellow@3x.png"; sourceTree = ""; }; + FF6281FF1A09685800271FDB /* WYPopoverController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WYPopoverController.h; path = "../../../../../Downloads/WYPopoverController-master/WYPopoverController/WYPopoverController.h"; sourceTree = ""; }; + FF6282001A09685800271FDB /* WYPopoverController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WYPopoverController.m; path = "../../../../../Downloads/WYPopoverController-master/WYPopoverController/WYPopoverController.m"; sourceTree = ""; }; + FF6282011A09685800271FDB /* WYStoryboardPopoverSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WYStoryboardPopoverSegue.h; path = "../../../../../Downloads/WYPopoverController-master/WYPopoverController/WYStoryboardPopoverSegue.h"; sourceTree = ""; }; + FF6282021A09685800271FDB /* WYStoryboardPopoverSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WYStoryboardPopoverSegue.m; path = "../../../../../Downloads/WYPopoverController-master/WYPopoverController/WYStoryboardPopoverSegue.m"; sourceTree = ""; }; FF6618C6176184560039913B /* NBNotifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NBNotifier.h; sourceTree = ""; }; FF6618C7176184560039913B /* NBNotifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NBNotifier.m; sourceTree = ""; }; FF67D3B0168924C40057A7DA /* TrainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrainerViewController.h; sourceTree = ""; }; @@ -2234,15 +2227,10 @@ 43A4BABE15C8663600F3B8D4 /* Popover */ = { isa = PBXGroup; children = ( - 43A4BABF15C8663600F3B8D4 /* UIBarButtonItem+WEPopover.h */, - 43A4BAC015C8663600F3B8D4 /* UIBarButtonItem+WEPopover.m */, - 43A4BAC115C8663600F3B8D4 /* WEPopoverContainerView.h */, - 43A4BAC215C8663600F3B8D4 /* WEPopoverContainerView.m */, - 43A4BAC315C8663600F3B8D4 /* WEPopoverController.h */, - 43A4BAC415C8663600F3B8D4 /* WEPopoverController.m */, - 43A4BAC515C8663600F3B8D4 /* WEPopoverParentView.h */, - 43A4BAC615C8663600F3B8D4 /* WETouchableView.h */, - 43A4BAC715C8663600F3B8D4 /* WETouchableView.m */, + FF6281FF1A09685800271FDB /* WYPopoverController.h */, + FF6282001A09685800271FDB /* WYPopoverController.m */, + FF6282011A09685800271FDB /* WYStoryboardPopoverSegue.h */, + FF6282021A09685800271FDB /* WYStoryboardPopoverSegue.m */, ); path = Popover; sourceTree = ""; @@ -3751,12 +3739,8 @@ 43E8382215BC73EB000553BE /* FirstTimeUserAddSitesViewController.m in Sources */, FFA0481819CA54A800618DC4 /* OSKPinboardUtility.m in Sources */, 436ACA8D15BF1088004E01CC /* NBContainerViewController.m in Sources */, - 43A4BAC815C8663600F3B8D4 /* UIBarButtonItem+WEPopover.m in Sources */, FFA047EB19CA54A800618DC4 /* OSKActivityIndicatorItem.m in Sources */, - 43A4BAC915C8663600F3B8D4 /* WEPopoverContainerView.m in Sources */, FFA0483E19CA5B8400618DC4 /* EventWindow.m in Sources */, - 43A4BACA15C8663600F3B8D4 /* WEPopoverController.m in Sources */, - 43A4BACB15C8663600F3B8D4 /* WETouchableView.m in Sources */, 432EBD2315D1D4070000729D /* AddSiteTableCell.m in Sources */, FFA047D719CA54A800618DC4 /* NSDate+OSK_ISO8601.m in Sources */, FFA0481B19CA54A800618DC4 /* OSKPresentationManager.m in Sources */, @@ -3802,6 +3786,7 @@ FF753CD0175858FC00344EC9 /* FMDatabasePool.m in Sources */, FF753CD1175858FC00344EC9 /* FMDatabaseQueue.m in Sources */, FF753CD3175858FC00344EC9 /* FMResultSet.m in Sources */, + FF6282041A09685800271FDB /* WYStoryboardPopoverSegue.m in Sources */, FF6618C8176184560039913B /* NBNotifier.m in Sources */, FF03AFF319F87F2E0063002A /* TUSafariActivity.m in Sources */, FFA0482419CA54A800618DC4 /* OSKSessionController_Pad.m in Sources */, @@ -3824,6 +3809,7 @@ FFF1E4BC177504CA00BF59D3 /* IASKSettingsReader.m in Sources */, FFA0480719CA54A800618DC4 /* OSKInstapaperUtility.m in Sources */, FFF1E4BD177504CA00BF59D3 /* IASKSettingsStore.m in Sources */, + FF6282031A09685800271FDB /* WYPopoverController.m in Sources */, FFF1E4BE177504CA00BF59D3 /* IASKSettingsStoreFile.m in Sources */, FFF1E4BF177504CA00BF59D3 /* IASKSettingsStoreUserDefaults.m in Sources */, FFF1E4C0177504CA00BF59D3 /* IASKSpecifier.m in Sources */, diff --git a/clients/ios/Popover/UIBarButtonItem+WEPopover.h b/clients/ios/Popover/UIBarButtonItem+WEPopover.h deleted file mode 100755 index 4cf59bdd3..000000000 --- a/clients/ios/Popover/UIBarButtonItem+WEPopover.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * UIBarButtonItem+WEPopover.h - * WEPopover - * - * Created by Werner Altewischer on 07/05/11. - * Copyright 2010 Werner IT Consultancy. All rights reserved. - * - */ - -#import -#import - -@interface UIBarButtonItem(WEPopover) - -- (CGRect)frameInView:(UIView *)v; -- (UIView *)superview; - -@end diff --git a/clients/ios/Popover/UIBarButtonItem+WEPopover.m b/clients/ios/Popover/UIBarButtonItem+WEPopover.m deleted file mode 100755 index 52b13d2a7..000000000 --- a/clients/ios/Popover/UIBarButtonItem+WEPopover.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * UIBarButtonItem+WEPopover.m - * WEPopover - * - * Created by Werner Altewischer on 07/05/11. - * Copyright 2010 Werner IT Consultancy. All rights reserved. - * - */ - -#import "UIBarButtonItem+WEPopover.h" - -@implementation UIBarButtonItem(WEPopover) - -- (CGRect)frameInView:(UIView *)v { - - UIView *theView = self.customView; - if (!theView && [self respondsToSelector:@selector(view)]) { - theView = [self performSelector:@selector(view)]; - } - - UIView *parentView = theView.superview; - NSArray *subviews = parentView.subviews; - - NSUInteger indexOfView = [subviews indexOfObject:theView]; - NSUInteger subviewCount = subviews.count; - - if (subviewCount > 0 && indexOfView != NSNotFound) { - UIView *button = [parentView.subviews objectAtIndex:indexOfView]; - return [button convertRect:button.bounds toView:v]; - } else { - return CGRectZero; - } -} - -- (UIView *)superview { - - UIView *theView = self.customView; - if (!theView && [self respondsToSelector:@selector(view)]) { - theView = [self performSelector:@selector(view)]; - } - - UIView *parentView = theView.superview; - return parentView; -} - -@end diff --git a/clients/ios/Popover/WEPopoverContainerView.h b/clients/ios/Popover/WEPopoverContainerView.h deleted file mode 100755 index ffe32a693..000000000 --- a/clients/ios/Popover/WEPopoverContainerView.h +++ /dev/null @@ -1,100 +0,0 @@ -// -// WEPopoverContainerView.h -// WEPopover -// -// Created by Werner Altewischer on 02/09/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import -#import - -/** - * @brief Properties for the container view determining the area where the actual content view can/may be displayed. Also Images can be supplied for the arrow images and background. - */ -@interface WEPopoverContainerViewProperties : NSObject -{ - NSString *bgImageName; - NSString *upArrowImageName; - NSString *downArrowImageName; - NSString *leftArrowImageName; - NSString *rightArrowImageName; - CGFloat leftBgMargin; - CGFloat rightBgMargin; - CGFloat topBgMargin; - CGFloat bottomBgMargin; - NSInteger topBgCapSize; - NSInteger leftBgCapSize; - CGFloat arrowMargin; -} - -@property(nonatomic, retain) NSString *bgImageName; -@property(nonatomic, retain) NSString *upArrowImageName; -@property(nonatomic, retain) NSString *downArrowImageName; -@property(nonatomic, retain) NSString *leftArrowImageName; -@property(nonatomic, retain) NSString *rightArrowImageName; -@property(nonatomic, assign) CGFloat leftBgMargin; -@property(nonatomic, assign) CGFloat rightBgMargin; -@property(nonatomic, assign) CGFloat topBgMargin; -@property(nonatomic, assign) CGFloat bottomBgMargin; -@property(nonatomic, assign) CGFloat leftContentMargin; -@property(nonatomic, assign) CGFloat rightContentMargin; -@property(nonatomic, assign) CGFloat topContentMargin; -@property(nonatomic, assign) CGFloat bottomContentMargin; -@property(nonatomic, assign) NSInteger topBgCapSize; -@property(nonatomic, assign) NSInteger leftBgCapSize; -@property(nonatomic, assign) CGFloat arrowMargin; - -@end - -@class WEPopoverContainerView; - -/** - * @brief Container/background view for displaying a popover view. - */ -@interface WEPopoverContainerView : UIView { - UIImage *bgImage; - UIImage *arrowImage; - - WEPopoverContainerViewProperties *properties; - - UIPopoverArrowDirection arrowDirection; - - CGRect arrowRect; - CGRect bgRect; - CGPoint offset; - CGPoint arrowOffset; - - CGSize correctedSize; - UIView *contentView; -} - -/** - * @brief The current arrow direction for the popover. - */ -@property (nonatomic, readonly) UIPopoverArrowDirection arrowDirection; - -/** - * @brief The content view being displayed. - */ -@property (nonatomic, retain) UIView *contentView; - -/** - * @brief Initializes the position of the popover with a size, anchor rect, display area and permitted arrow directions and optionally the properties. - * If the last is not supplied the defaults are taken (requires images to be present in bundle representing a black rounded background with partial transparency). - */ -- (id)initWithSize:(CGSize)theSize - anchorRect:(CGRect)anchorRect - displayArea:(CGRect)displayArea -permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections - properties:(WEPopoverContainerViewProperties *)properties; - -/** - * @brief To update the position of the popover with a new anchor rect, display area and permitted arrow directions - */ -- (void)updatePositionWithSize:(CGSize)theSize - anchorRect:(CGRect)anchorRect - displayArea:(CGRect)displayArea - permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections; - -@end diff --git a/clients/ios/Popover/WEPopoverContainerView.m b/clients/ios/Popover/WEPopoverContainerView.m deleted file mode 100755 index bc35d4d80..000000000 --- a/clients/ios/Popover/WEPopoverContainerView.m +++ /dev/null @@ -1,366 +0,0 @@ -// -// WEPopoverContainerViewProperties.m -// WEPopover -// -// Created by Werner Altewischer on 02/09/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import "WEPopoverContainerView.h" - -@implementation WEPopoverContainerViewProperties - -@synthesize bgImageName, upArrowImageName, downArrowImageName, leftArrowImageName, rightArrowImageName, topBgMargin, bottomBgMargin, leftBgMargin, rightBgMargin, topBgCapSize, leftBgCapSize; -@synthesize leftContentMargin, rightContentMargin, topContentMargin, bottomContentMargin, arrowMargin; - -- (void)dealloc { - self.bgImageName = nil; - self.upArrowImageName = nil; - self.downArrowImageName = nil; - self.leftArrowImageName = nil; - self.rightArrowImageName = nil; - [super dealloc]; -} - -@end - -@interface WEPopoverContainerView(Private) - -- (void)determineGeometryForSize:(CGSize)theSize anchorRect:(CGRect)anchorRect displayArea:(CGRect)displayArea permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections; -- (CGRect)contentRect; -- (CGSize)contentSize; -- (void)setProperties:(WEPopoverContainerViewProperties *)props; -- (void)initFrame; - -@end - -@implementation WEPopoverContainerView - -@synthesize arrowDirection, contentView; - -- (id)initWithSize:(CGSize)theSize - anchorRect:(CGRect)anchorRect - displayArea:(CGRect)displayArea -permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections - properties:(WEPopoverContainerViewProperties *)theProperties { - if ((self = [super initWithFrame:CGRectZero])) { - - [self setProperties:theProperties]; - correctedSize = CGSizeMake(theSize.width + properties.leftBgMargin + properties.rightBgMargin + properties.leftContentMargin + properties.rightContentMargin, - theSize.height + properties.topBgMargin + properties.bottomBgMargin + properties.topContentMargin + properties.bottomContentMargin); - [self determineGeometryForSize:correctedSize anchorRect:anchorRect displayArea:displayArea permittedArrowDirections:permittedArrowDirections]; - [self initFrame]; - self.backgroundColor = [UIColor clearColor]; - UIImage *theImage = [UIImage imageNamed:properties.bgImageName]; - bgImage = [[theImage stretchableImageWithLeftCapWidth:properties.leftBgCapSize topCapHeight:properties.topBgCapSize] retain]; - - self.clipsToBounds = YES; - self.userInteractionEnabled = YES; - } - return self; -} - -- (void)dealloc { - [properties release]; - [contentView release]; - [bgImage release]; - [arrowImage release]; - [super dealloc]; -} - -- (void)drawRect:(CGRect)rect { - [bgImage drawInRect:bgRect blendMode:kCGBlendModeNormal alpha:1.0]; - [arrowImage drawInRect:arrowRect blendMode:kCGBlendModeNormal alpha:1.0]; -} - -- (void)updatePositionWithSize:(CGSize)theSize - anchorRect:(CGRect)anchorRect - displayArea:(CGRect)displayArea - permittedArrowDirections:(UIPopoverArrowDirection)permittedArrowDirections { - - correctedSize = CGSizeMake(theSize.width + properties.leftBgMargin + properties.rightBgMargin + properties.leftContentMargin + properties.rightContentMargin, - theSize.height + properties.topBgMargin + properties.bottomBgMargin + properties.topContentMargin + properties.bottomContentMargin); - [self determineGeometryForSize:correctedSize anchorRect:anchorRect displayArea:displayArea permittedArrowDirections:permittedArrowDirections]; - [self initFrame]; - [self setNeedsDisplay]; - -} - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { - return CGRectContainsPoint(self.contentRect, point); -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - -} - -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { - -} - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - -} - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { - -} - -- (void)setContentView:(UIView *)v { - if (v != contentView) { - [contentView release]; - contentView = [v retain]; - contentView.frame = self.contentRect; - [self addSubview:contentView]; - } -} - - - -@end - -@implementation WEPopoverContainerView(Private) - -- (void)initFrame { - CGRect theFrame = CGRectOffset(CGRectUnion(bgRect, arrowRect), offset.x, offset.y); - - //If arrow rect origin is < 0 the frame above is extended to include it so we should offset the other rects - arrowOffset = CGPointMake(MAX(0, -arrowRect.origin.x), MAX(0, -arrowRect.origin.y)); - bgRect = CGRectOffset(bgRect, arrowOffset.x, arrowOffset.y); - arrowRect = CGRectOffset(arrowRect, arrowOffset.x, arrowOffset.y); - - self.frame = CGRectIntegral(theFrame); -} - -- (CGSize)contentSize { - return self.contentRect.size; -} - -- (CGRect)contentRect { - CGRect rect = CGRectMake(properties.leftBgMargin + properties.leftContentMargin + arrowOffset.x, - properties.topBgMargin + properties.topContentMargin + arrowOffset.y, - bgRect.size.width - properties.leftBgMargin - properties.rightBgMargin - properties.leftContentMargin - properties.rightContentMargin, - bgRect.size.height - properties.topBgMargin - properties.bottomBgMargin - properties.topContentMargin - properties.bottomContentMargin); - return rect; -} - -- (void)setProperties:(WEPopoverContainerViewProperties *)props { - if (properties != props) { - [properties release]; - properties = [props retain]; - } -} - -- (void)determineGeometryForSize:(CGSize)theSize anchorRect:(CGRect)anchorRect displayArea:(CGRect)displayArea permittedArrowDirections:(UIPopoverArrowDirection)supportedArrowDirections { - - //Determine the frame, it should not go outside the display area - UIPopoverArrowDirection theArrowDirection = UIPopoverArrowDirectionUp; - - offset = CGPointZero; - bgRect = CGRectZero; - arrowRect = CGRectZero; - arrowDirection = UIPopoverArrowDirectionUnknown; - - CGFloat biggestSurface = 0.0f; - CGFloat currentMinMargin = 0.0f; - - UIImage *upArrowImage = [UIImage imageNamed:properties.upArrowImageName]; - UIImage *downArrowImage = [UIImage imageNamed:properties.downArrowImageName]; - UIImage *leftArrowImage = [UIImage imageNamed:properties.leftArrowImageName]; - UIImage *rightArrowImage = [UIImage imageNamed:properties.rightArrowImageName]; - - while (theArrowDirection <= UIPopoverArrowDirectionRight) { - - if ((supportedArrowDirections & theArrowDirection)) { - - CGRect theBgRect = CGRectMake(0, 0, theSize.width, theSize.height); - CGRect theArrowRect = CGRectZero; - CGPoint theOffset = CGPointZero; - CGFloat xArrowOffset = 0.0; - CGFloat yArrowOffset = 0.0; - CGPoint anchorPoint = CGPointZero; - - switch (theArrowDirection) { - case UIPopoverArrowDirectionUp: - - anchorPoint = CGPointMake(CGRectGetMidX(anchorRect) - displayArea.origin.x, CGRectGetMaxY(anchorRect) - displayArea.origin.y); - - xArrowOffset = theSize.width / 2 - upArrowImage.size.width / 2; - yArrowOffset = properties.topBgMargin - upArrowImage.size.height; - - theOffset = CGPointMake(anchorPoint.x - xArrowOffset - upArrowImage.size.width / 2, anchorPoint.y - yArrowOffset); - - if (theOffset.x < 0) { - xArrowOffset += theOffset.x; - theOffset.x = 0; - } else if (theOffset.x + theSize.width > displayArea.size.width) { - xArrowOffset += (theOffset.x + theSize.width - displayArea.size.width); - theOffset.x = displayArea.size.width - theSize.width; - } - - //Cap the arrow offset - xArrowOffset = MAX(xArrowOffset, properties.leftBgMargin + properties.arrowMargin); - xArrowOffset = MIN(xArrowOffset, theSize.width - properties.rightBgMargin - properties.arrowMargin - upArrowImage.size.width); - - theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, upArrowImage.size.width, upArrowImage.size.height); - - break; - case UIPopoverArrowDirectionDown: - - anchorPoint = CGPointMake(CGRectGetMidX(anchorRect) - displayArea.origin.x, CGRectGetMinY(anchorRect) - displayArea.origin.y); - - xArrowOffset = theSize.width / 2 - downArrowImage.size.width / 2; - yArrowOffset = theSize.height - properties.bottomBgMargin; - - theOffset = CGPointMake(anchorPoint.x - xArrowOffset - downArrowImage.size.width / 2, anchorPoint.y - yArrowOffset - downArrowImage.size.height); - - if (theOffset.x < 0) { - xArrowOffset += theOffset.x; - theOffset.x = 0; - } else if (theOffset.x + theSize.width > displayArea.size.width) { - xArrowOffset += (theOffset.x + theSize.width - displayArea.size.width); - theOffset.x = displayArea.size.width - theSize.width; - } - - //Cap the arrow offset - xArrowOffset = MAX(xArrowOffset, properties.leftBgMargin + properties.arrowMargin); - xArrowOffset = MIN(xArrowOffset, theSize.width - properties.rightBgMargin - properties.arrowMargin - downArrowImage.size.width); - - theArrowRect = CGRectMake(xArrowOffset , yArrowOffset, downArrowImage.size.width, downArrowImage.size.height); - - break; - case UIPopoverArrowDirectionLeft: - - anchorPoint = CGPointMake(CGRectGetMaxX(anchorRect) - displayArea.origin.x, CGRectGetMidY(anchorRect) - displayArea.origin.y); - - xArrowOffset = properties.leftBgMargin - leftArrowImage.size.width; - yArrowOffset = theSize.height / 2 - leftArrowImage.size.height / 2; - - theOffset = CGPointMake(anchorPoint.x - xArrowOffset, anchorPoint.y - yArrowOffset - leftArrowImage.size.height / 2); - - if (theOffset.y < 0) { - yArrowOffset += theOffset.y; - theOffset.y = 0; - } else if (theOffset.y + theSize.height > displayArea.size.height) { - yArrowOffset += (theOffset.y + theSize.height - displayArea.size.height); - theOffset.y = displayArea.size.height - theSize.height; - } - - //Cap the arrow offset - yArrowOffset = MAX(yArrowOffset, properties.topBgMargin + properties.arrowMargin); - yArrowOffset = MIN(yArrowOffset, theSize.height - properties.bottomBgMargin - properties.arrowMargin - leftArrowImage.size.height); - - theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, leftArrowImage.size.width, leftArrowImage.size.height); - - break; - case UIPopoverArrowDirectionRight: - - anchorPoint = CGPointMake(CGRectGetMinX(anchorRect) - displayArea.origin.x, CGRectGetMidY(anchorRect) - displayArea.origin.y); - - xArrowOffset = theSize.width - properties.rightBgMargin; - yArrowOffset = theSize.height / 2 - rightArrowImage.size.width / 2; - - theOffset = CGPointMake(anchorPoint.x - xArrowOffset - rightArrowImage.size.width, anchorPoint.y - yArrowOffset - rightArrowImage.size.height / 2); - - if (theOffset.y < 0) { - yArrowOffset += theOffset.y; - theOffset.y = 0; - } else if (theOffset.y + theSize.height > displayArea.size.height) { - yArrowOffset += (theOffset.y + theSize.height - displayArea.size.height); - theOffset.y = displayArea.size.height - theSize.height; - } - - //Cap the arrow offset - yArrowOffset = MAX(yArrowOffset, properties.topBgMargin + properties.arrowMargin); - yArrowOffset = MIN(yArrowOffset, theSize.height - properties.bottomBgMargin - properties.arrowMargin - rightArrowImage.size.height); - - theArrowRect = CGRectMake(xArrowOffset, yArrowOffset, rightArrowImage.size.width, rightArrowImage.size.height); - - break; - default: - break; - } - - CGRect bgFrame = CGRectOffset(theBgRect, theOffset.x, theOffset.y); - - CGFloat minMarginLeft = CGRectGetMinX(bgFrame); - CGFloat minMarginRight = CGRectGetWidth(displayArea) - CGRectGetMaxX(bgFrame); - CGFloat minMarginTop = CGRectGetMinY(bgFrame); - CGFloat minMarginBottom = CGRectGetHeight(displayArea) - CGRectGetMaxY(bgFrame); - - if (minMarginLeft < 0) { - // Popover is too wide and clipped on the left; decrease width - // and move it to the right - theOffset.x -= minMarginLeft; - theBgRect.size.width += minMarginLeft; - minMarginLeft = 0; - if (theArrowDirection == UIPopoverArrowDirectionRight) { - theArrowRect.origin.x = CGRectGetMaxX(theBgRect) - properties.rightBgMargin; - } - } - if (minMarginRight < 0) { - // Popover is too wide and clipped on the right; decrease width. - theBgRect.size.width += minMarginRight; - minMarginRight = 0; - if (theArrowDirection == UIPopoverArrowDirectionLeft) { - theArrowRect.origin.x = CGRectGetMinX(theBgRect) - leftArrowImage.size.width + properties.leftBgMargin; - } - } - if (minMarginTop < 0) { - // Popover is too high and clipped at the top; decrease height - // and move it down - theOffset.y -= minMarginTop; - theBgRect.size.height += minMarginTop; - minMarginTop = 0; - if (theArrowDirection == UIPopoverArrowDirectionDown) { - theArrowRect.origin.y = CGRectGetMaxY(theBgRect) - properties.bottomBgMargin; - } - } - if (minMarginBottom < 0) { - // Popover is too high and clipped at the bottom; decrease height. - theBgRect.size.height += minMarginBottom; - minMarginBottom = 0; - if (theArrowDirection == UIPopoverArrowDirectionUp) { - theArrowRect.origin.y = CGRectGetMinY(theBgRect) - upArrowImage.size.height + properties.topBgMargin; - } - } - - CGFloat minMargin = MIN(minMarginLeft, minMarginRight); - minMargin = MIN(minMargin, minMarginTop); - minMargin = MIN(minMargin, minMarginBottom); - - // Calculate intersection and surface - CGFloat surface = theBgRect.size.width * theBgRect.size.height; - - if (surface >= biggestSurface && minMargin >= currentMinMargin) { - biggestSurface = surface; - offset = CGPointMake(theOffset.x + displayArea.origin.x, theOffset.y + displayArea.origin.y); - arrowRect = theArrowRect; - bgRect = theBgRect; - arrowDirection = theArrowDirection; - currentMinMargin = minMargin; - } - } - - theArrowDirection <<= 1; - } - - switch (arrowDirection) { - case UIPopoverArrowDirectionUp: - arrowImage = [upArrowImage retain]; - break; - case UIPopoverArrowDirectionDown: - arrowImage = [downArrowImage retain]; - break; - case UIPopoverArrowDirectionLeft: - arrowImage = [leftArrowImage retain]; - break; - case UIPopoverArrowDirectionRight: - arrowImage = [rightArrowImage retain]; - break; - default: - break; - } -} - -@end \ No newline at end of file diff --git a/clients/ios/Popover/WEPopoverController.h b/clients/ios/Popover/WEPopoverController.h deleted file mode 100755 index 6261a8768..000000000 --- a/clients/ios/Popover/WEPopoverController.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// WEPopoverController.h -// WEPopover -// -// Created by Werner Altewischer on 02/09/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import -#import -#import "WEPopoverContainerView.h" -#import "WETouchableView.h" - -@class WEPopoverController; - -@protocol WEPopoverControllerDelegate - -- (void)popoverControllerDidDismissPopover:(WEPopoverController *)popoverController; -- (BOOL)popoverControllerShouldDismissPopover:(WEPopoverController *)popoverController; - -@end - -/** - * @brief Popover controller for the iPhone, mimicing the iPad UIPopoverController interface. See that class for more details. - */ -@interface WEPopoverController : NSObject { - UIViewController *contentViewController; - UIView *view; - UIView *parentView; - WETouchableView *backgroundView; - - BOOL popoverVisible; - UIPopoverArrowDirection popoverArrowDirection; - id delegate; - CGSize popoverContentSize; - WEPopoverContainerViewProperties *containerViewProperties; - id context; - NSArray *passthroughViews; -} - -@property(nonatomic, retain) UIViewController *contentViewController; - -@property (nonatomic, readonly) UIView *view; -@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible; -@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection; -@property (nonatomic, assign) id delegate; -@property (nonatomic, assign) CGSize popoverContentSize; -@property (nonatomic, retain) WEPopoverContainerViewProperties *containerViewProperties; -@property (nonatomic, retain) id context; -@property (nonatomic, assign) UIView *parentView; -@property (nonatomic, copy) NSArray *passthroughViews; - -- (id)initWithContentViewController:(UIViewController *)theContentViewController; - -- (void)dismissPopoverAnimated:(BOOL)animated; - -- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated; - -- (void)presentPopoverFromRect:(CGRect)rect - inView:(UIView *)view - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated; - -- (void)repositionPopoverFromRect:(CGRect)rect - inView:(UIView *)view - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections; - -- (void)repositionPopoverFromRect:(CGRect)rect - inView:(UIView *)view - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated; - -@end diff --git a/clients/ios/Popover/WEPopoverController.m b/clients/ios/Popover/WEPopoverController.m deleted file mode 100755 index c8476dee0..000000000 --- a/clients/ios/Popover/WEPopoverController.m +++ /dev/null @@ -1,377 +0,0 @@ -// -// WEPopoverController.m -// WEPopover -// -// Created by Werner Altewischer on 02/09/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import "WEPopoverController.h" -#import "WEPopoverParentView.h" -#import "UIBarButtonItem+WEPopover.h" - -#define FADE_DURATION 0.3 - -@interface WEPopoverController(Private) - -- (UIView *)keyView; -- (void)updateBackgroundPassthroughViews; -- (void)setView:(UIView *)v; -- (CGRect)displayAreaForView:(UIView *)theView; -- (WEPopoverContainerViewProperties *)defaultContainerViewProperties; -- (void)dismissPopoverAnimated:(BOOL)animated userInitiated:(BOOL)userInitiated; - -@end - - -@implementation WEPopoverController - -@synthesize contentViewController; -@synthesize popoverContentSize; -@synthesize popoverVisible; -@synthesize popoverArrowDirection; -@synthesize delegate; -@synthesize view; -@synthesize parentView; -@synthesize containerViewProperties; -@synthesize context; -@synthesize passthroughViews; - -- (id)init { - if ((self = [super init])) { - } - return self; -} - -- (id)initWithContentViewController:(UIViewController *)viewController { - if ((self = [self init])) { - self.contentViewController = viewController; - } - return self; -} - -- (void)dealloc { - [self dismissPopoverAnimated:NO]; - [contentViewController release]; - [containerViewProperties release]; - [passthroughViews release]; - self.context = nil; - [super dealloc]; -} - -- (void)setContentViewController:(UIViewController *)vc { - if (vc != contentViewController) { - [contentViewController release]; - contentViewController = [vc retain]; - popoverContentSize = CGSizeZero; - } -} - -- (BOOL)forwardAppearanceMethods { - return YES; - return ![contentViewController respondsToSelector:@selector(shouldAutomaticallyForwardAppearanceMethods)]; -} - -//Overridden setter to copy the passthroughViews to the background view if it exists already -- (void)setPassthroughViews:(NSArray *)array { - [passthroughViews release]; - passthroughViews = nil; - if (array) { - passthroughViews = [[NSArray alloc] initWithArray:array]; - } - [self updateBackgroundPassthroughViews]; -} - -- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)theContext { - - if ([animationID isEqual:@"FadeIn"]) { - self.view.userInteractionEnabled = YES; - popoverVisible = YES; - - if ([self forwardAppearanceMethods]) { - [contentViewController viewDidAppear:YES]; - } - } else if ([animationID isEqual:@"FadeOut"]) { - popoverVisible = NO; - - if ([self forwardAppearanceMethods]) { - [contentViewController viewDidDisappear:YES]; - } - [self.view removeFromSuperview]; - self.view = nil; - [backgroundView removeFromSuperview]; - [backgroundView release]; - backgroundView = nil; - - BOOL userInitiatedDismissal = [(NSNumber *)theContext boolValue]; - - if (userInitiatedDismissal) { - //Only send message to delegate in case the user initiated this event, which is if he touched outside the view - [delegate popoverControllerDidDismissPopover:self]; - } - } -} - -- (void)dismissPopoverAnimated:(BOOL)animated { - - [self dismissPopoverAnimated:animated userInitiated:NO]; -} - -- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated { - - UIView *v = [self keyView]; - CGRect rect = [item frameInView:v]; - - return [self presentPopoverFromRect:rect inView:v permittedArrowDirections:arrowDirections animated:animated]; -} - -- (void)presentPopoverFromRect:(CGRect)rect - inView:(UIView *)theView - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated { - - - [self dismissPopoverAnimated:NO]; - - //First force a load view for the contentViewController so the popoverContentSize is properly initialized - [contentViewController view]; - - if (CGSizeEqualToSize(popoverContentSize, CGSizeZero)) { - popoverContentSize = contentViewController.preferredContentSize; - } - - CGRect displayArea = [self displayAreaForView:theView]; - - WEPopoverContainerViewProperties *props = self.containerViewProperties ? self.containerViewProperties : [self defaultContainerViewProperties]; - WEPopoverContainerView *containerView = [[[WEPopoverContainerView alloc] initWithSize:self.popoverContentSize anchorRect:rect displayArea:displayArea permittedArrowDirections:arrowDirections properties:props] autorelease]; - popoverArrowDirection = containerView.arrowDirection; - - UIView *keyView = self.keyView; - - backgroundView = [[WETouchableView alloc] initWithFrame:keyView.bounds]; - backgroundView.contentMode = UIViewContentModeScaleToFill; - backgroundView.autoresizingMask = ( UIViewAutoresizingFlexibleLeftMargin | - UIViewAutoresizingFlexibleWidth | - UIViewAutoresizingFlexibleRightMargin | - UIViewAutoresizingFlexibleTopMargin | - UIViewAutoresizingFlexibleHeight | - UIViewAutoresizingFlexibleBottomMargin); - backgroundView.backgroundColor = [UIColor clearColor]; - backgroundView.delegate = self; - - [keyView addSubview:backgroundView]; - - containerView.frame = [theView convertRect:containerView.frame toView:backgroundView]; - - [backgroundView addSubview:containerView]; - - containerView.contentView = contentViewController.view; - containerView.autoresizingMask = ( UIViewAutoresizingFlexibleLeftMargin | - UIViewAutoresizingFlexibleRightMargin); - - self.view = containerView; - [self updateBackgroundPassthroughViews]; - - if ([self forwardAppearanceMethods]) { - [contentViewController viewWillAppear:animated]; - } - [self.view becomeFirstResponder]; - popoverVisible = YES; - if (animated) { - self.view.alpha = 0.0; - - [UIView animateWithDuration:FADE_DURATION - delay:0.0 - options:UIViewAnimationCurveLinear - animations:^{ - - self.view.alpha = 1.0; - - } completion:^(BOOL finished) { - - [self animationDidStop:@"FadeIn" finished:[NSNumber numberWithBool:finished] context:nil]; - }]; - - } else { - if ([self forwardAppearanceMethods]) { - [contentViewController viewDidAppear:animated]; - } - } -} - -- (void)repositionPopoverFromRect:(CGRect)rect - inView:(UIView *)theView - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections -{ - - [self repositionPopoverFromRect:rect - inView:theView - permittedArrowDirections:arrowDirections - animated:NO]; -} - -- (void)repositionPopoverFromRect:(CGRect)rect - inView:(UIView *)theView - permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections - animated:(BOOL)animated { - - if (animated) { - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:FADE_DURATION]; - [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; - } - - if (CGSizeEqualToSize(popoverContentSize, CGSizeZero)) { - popoverContentSize = contentViewController.preferredContentSize; - } - - CGRect displayArea = [self displayAreaForView:theView]; - WEPopoverContainerView *containerView = (WEPopoverContainerView *)self.view; - [containerView updatePositionWithSize:self.popoverContentSize - anchorRect:rect - displayArea:displayArea - permittedArrowDirections:arrowDirections]; - - popoverArrowDirection = containerView.arrowDirection; - containerView.frame = [theView convertRect:containerView.frame toView:backgroundView]; - - if (animated) { - [UIView commitAnimations]; - } -} - -#pragma mark - -#pragma mark WETouchableViewDelegate implementation - -- (void)viewWasTouched:(WETouchableView *)view { - if (popoverVisible) { - if (!delegate || [delegate popoverControllerShouldDismissPopover:self]) { - [self dismissPopoverAnimated:YES userInitiated:YES]; - } - } -} - -- (BOOL)isPopoverVisible { - if (!popoverVisible) { - return NO; - } - UIView *sv = self.view; - BOOL foundWindowAsSuperView = NO; - while ((sv = sv.superview) != nil) { - if ([sv isKindOfClass:[UIWindow class]]) { - foundWindowAsSuperView = YES; - break; - } - } - return foundWindowAsSuperView; -} - -@end - - -@implementation WEPopoverController(Private) - -- (UIView *)keyView { - if (self.parentView) { - return self.parentView; - } else { - UIWindow *w = [[UIApplication sharedApplication] keyWindow]; - if (w.subviews.count > 0) { - return [w.subviews objectAtIndex:0]; - } else { - return w; - } - } -} - -- (void)setView:(UIView *)v { - if (view != v) { - [view release]; - view = [v retain]; - } -} - -- (void)updateBackgroundPassthroughViews { - backgroundView.passthroughViews = passthroughViews; -} - - -- (void)dismissPopoverAnimated:(BOOL)animated userInitiated:(BOOL)userInitiated { - if (self.view) { - if ([self forwardAppearanceMethods]) { - [contentViewController viewWillDisappear:animated]; - } - popoverVisible = NO; - [self.view resignFirstResponder]; - if (animated) { - self.view.userInteractionEnabled = NO; - - [UIView animateWithDuration:FADE_DURATION - delay:0.0 - options:UIViewAnimationCurveLinear - animations:^{ - - self.view.alpha = 0.0; - - } completion:^(BOOL finished) { - - [self animationDidStop:@"FadeOut" finished:[NSNumber numberWithBool:finished] context:[NSNumber numberWithBool:userInitiated]]; - }]; - - - } else { - if ([self forwardAppearanceMethods]) { - [contentViewController viewDidDisappear:animated]; - } - [self.view removeFromSuperview]; - self.view = nil; - [backgroundView removeFromSuperview]; - [backgroundView release]; - backgroundView = nil; - } - } -} - -- (CGRect)displayAreaForView:(UIView *)theView { - CGRect displayArea = CGRectZero; - if ([theView conformsToProtocol:@protocol(WEPopoverParentView)] && [theView respondsToSelector:@selector(displayAreaForPopover)]) { - displayArea = [(id )theView displayAreaForPopover]; - } else { - UIView *keyView = [self keyView]; - displayArea = [keyView convertRect:keyView.bounds toView:theView]; - } - return displayArea; -} - -//Enable to use the simple popover style -- (WEPopoverContainerViewProperties *)defaultContainerViewProperties { - WEPopoverContainerViewProperties *ret = [[WEPopoverContainerViewProperties new] autorelease]; - - CGSize imageSize = CGSizeMake(30.0f, 30.0f); - NSString *bgImageName = @"popoverBgSimple.png"; - CGFloat bgMargin = 6.0; - CGFloat contentMargin = 2.0; - - ret.leftBgMargin = bgMargin; - ret.rightBgMargin = bgMargin; - ret.topBgMargin = bgMargin; - ret.bottomBgMargin = bgMargin; - ret.leftBgCapSize = imageSize.width/2; - ret.topBgCapSize = imageSize.height/2; - ret.bgImageName = bgImageName; - ret.leftContentMargin = contentMargin; - ret.rightContentMargin = contentMargin; - ret.topContentMargin = contentMargin; - ret.bottomContentMargin = contentMargin; - ret.arrowMargin = 1.0; - - ret.upArrowImageName = @"popoverArrowUpSimple.png"; - ret.downArrowImageName = @"popoverArrowDownSimple.png"; - ret.leftArrowImageName = @"popoverArrowLeftSimple.png"; - ret.rightArrowImageName = @"popoverArrowRightSimple.png"; - return ret; -} - -@end diff --git a/clients/ios/Popover/WEPopoverParentView.h b/clients/ios/Popover/WEPopoverParentView.h deleted file mode 100755 index d881bfe48..000000000 --- a/clients/ios/Popover/WEPopoverParentView.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * WEPopoverParentView.h - * WEPopover - * - * Created by Werner Altewischer on 02/09/10. - * Copyright 2010 Werner IT Consultancy. All rights reserved. - * - */ - -#import -#import - -@protocol WEPopoverParentView - -@optional -- (CGRect)displayAreaForPopover; - -@end \ No newline at end of file diff --git a/clients/ios/Popover/WETouchableView.h b/clients/ios/Popover/WETouchableView.h deleted file mode 100755 index 5210205e1..000000000 --- a/clients/ios/Popover/WETouchableView.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// WETouchableView.h -// WEPopover -// -// Created by Werner Altewischer on 12/21/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import -#import - -@class WETouchableView; - -/** - * @brief delegate to receive touch events - */ -@protocol WETouchableViewDelegate - -- (void)viewWasTouched:(WETouchableView *)view; - -@end - -/** - * @brief View that can handle touch events and/or disable touch forwording to child views - */ -@interface WETouchableView : UIView { - BOOL touchForwardingDisabled; - id delegate; - NSArray *passthroughViews; - BOOL testHits; -} - -@property (nonatomic, assign) BOOL touchForwardingDisabled; -@property (nonatomic, assign) id delegate; -@property (nonatomic, copy) NSArray *passthroughViews; - -@end diff --git a/clients/ios/Popover/WETouchableView.m b/clients/ios/Popover/WETouchableView.m deleted file mode 100755 index e04fc9d8a..000000000 --- a/clients/ios/Popover/WETouchableView.m +++ /dev/null @@ -1,70 +0,0 @@ -// -// WETouchableView.m -// WEPopover -// -// Created by Werner Altewischer on 12/21/10. -// Copyright 2010 Werner IT Consultancy. All rights reserved. -// - -#import "WETouchableView.h" - -@interface WETouchableView(Private) - -- (BOOL)isPassthroughView:(UIView *)v; - -@end - -@implementation WETouchableView - -@synthesize touchForwardingDisabled, delegate, passthroughViews; - -- (void)dealloc { - [passthroughViews release]; - [super dealloc]; -} - -- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { - if (testHits) { - return nil; - } else if (touchForwardingDisabled) { - return self; - } else { - UIView *hitView = [super hitTest:point withEvent:event]; - - if (hitView == self) { - //Test whether any of the passthrough views would handle this touch - testHits = YES; - UIView *superHitView = [self.superview hitTest:point withEvent:event]; - testHits = NO; - - if ([self isPassthroughView:superHitView]) { - hitView = superHitView; - } - } - - return hitView; - } -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - [self.delegate viewWasTouched:self]; -} - -@end - -@implementation WETouchableView(Private) - -- (BOOL)isPassthroughView:(UIView *)v { - - if (v == nil) { - return NO; - } - - if ([passthroughViews containsObject:v]) { - return YES; - } - - return [self isPassthroughView:v.superview]; -} - -@end