diff --git a/REMenu/REMenu.h b/REMenu/REMenu.h index 89cd8b5..ef3707f 100644 --- a/REMenu/REMenu.h +++ b/REMenu/REMenu.h @@ -27,7 +27,6 @@ #import #import "RECommonFunctions.h" #import "REMenuItem.h" -#import "REMenuContainerView.h" @class REMenu; @class REMenuItem; diff --git a/REMenu/REMenu.m b/REMenu/REMenu.m index 9d0c367..6434fd1 100644 --- a/REMenu/REMenu.m +++ b/REMenu/REMenu.m @@ -35,14 +35,15 @@ @interface REMenuItem () @interface REMenu () -@property (strong, readwrite, nonatomic) UIView *menuView; +@property (strong, readwrite, nonatomic) UIScrollView *menuView; @property (strong, readwrite, nonatomic) UIView *menuWrapperView; -@property (strong, readwrite, nonatomic) REMenuContainerView *containerView; +@property (strong, readwrite, nonatomic) UIView *containerView; @property (strong, readwrite, nonatomic) UIButton *backgroundButton; @property (assign, readwrite, nonatomic) BOOL isOpen; @property (assign, readwrite, nonatomic) BOOL isAnimating; @property (strong, readwrite, nonatomic) NSMutableArray *itemViews; @property (weak, readwrite, nonatomic) UINavigationBar *navigationBar; +@property (weak, readwrite, nonatomic) UIView *viewToShowFrom; @property (strong, readwrite, nonatomic) UIToolbar *toolbar; @end @@ -117,10 +118,12 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view self.isOpen = YES; self.isAnimating = YES; + self.viewToShowFrom = view; + // Create views // self.containerView = ({ - REMenuContainerView *view = [[REMenuContainerView alloc] init]; + UIView *view = [[UIView alloc] init]; view.clipsToBounds = YES; view.autoresizingMask = UIViewAutoresizingFlexibleWidth; @@ -132,7 +135,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view }); self.menuView = ({ - UIView *view = [[UIView alloc] init]; + UIScrollView *view = [[UIScrollView alloc] init]; if (!self.liveBlur || !REUIKitIsFlatMode()) { view.backgroundColor = self.backgroundColor; } @@ -184,8 +187,6 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view button; }); - CGFloat navigationBarOffset = self.appearsBehindNavigationBar && self.navigationBar ? 64 : 0; - // Append new item views to REMenuView // for (REMenuItem *item in self.items) { @@ -196,7 +197,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view itemHeight += self.cornerRadius; UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(self.separatorOffset.width, - index * self.itemHeight + index * self.separatorHeight + 40.0 + navigationBarOffset + self.separatorOffset.height, + index * self.itemHeight + index * self.separatorHeight + self.separatorOffset.height, rect.size.width - self.separatorOffset.width, self.separatorHeight)]; separatorView.backgroundColor = self.separatorColor; @@ -204,7 +205,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view [self.menuView addSubview:separatorView]; REMenuItemView *itemView = [[REMenuItemView alloc] initWithFrame:CGRectMake(0, - index * self.itemHeight + (index + 1.0) * self.separatorHeight + 40.0 + navigationBarOffset, + index * self.itemHeight + (index + 1.0) * self.separatorHeight, rect.size.width, itemHeight) menu:self item:item @@ -222,8 +223,11 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view // Set up frames // - self.menuWrapperView.frame = CGRectMake(0, -self.combinedHeight - navigationBarOffset, rect.size.width, self.combinedHeight + navigationBarOffset); - self.menuView.frame = self.menuWrapperView.bounds; + self.menuWrapperView.frame = CGRectMake(0, -self.combinedHeight, self.viewToShowFrom.bounds.size.width, self.combinedHeight); + CGFloat height = MIN(rect.size.height, MIN(self.viewToShowFrom.bounds.size.height - self.navigationBarOffset, self.combinedHeight)); + self.menuView.frame = CGRectMake(0, 0, self.viewToShowFrom.bounds.size.width, height); + self.menuView.contentSize = CGSizeMake(self.viewToShowFrom.bounds.size.width, self.combinedHeight); + if (REUIKitIsFlatMode() && self.liveBlur) { self.toolbar.frame = self.menuWrapperView.bounds; } @@ -257,7 +261,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view animations:^{ self.backgroundView.alpha = self.backgroundAlpha; CGRect frame = self.menuView.frame; - frame.origin.y = -40.0 - self.separatorHeight; + frame.origin.y = self.navigationBarOffset; self.menuWrapperView.frame = frame; } completion:^(BOOL finished) { self.isAnimating = NO; @@ -272,7 +276,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view animations:^{ self.backgroundView.alpha = self.backgroundAlpha; CGRect frame = self.menuView.frame; - frame.origin.y = -40.0 - self.separatorHeight; + frame.origin.y = self.navigationBarOffset; self.menuWrapperView.frame = frame; } completion:^(BOOL finished) { self.isAnimating = NO; @@ -289,7 +293,7 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view animations:^{ self.backgroundView.alpha = self.backgroundAlpha; CGRect frame = self.menuView.frame; - frame.origin.y = -40.0 - self.separatorHeight; + frame.origin.y = self.navigationBarOffset; self.menuWrapperView.frame = frame; } completion:^(BOOL finished) { self.isAnimating = NO; @@ -298,6 +302,21 @@ - (void)showFromRect:(CGRect)rect inView:(UIView *)view } }]; } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateViewOnRotate:) name:UIDeviceOrientationDidChangeNotification object:@(rect.size.height)]; +} + +- (CGFloat) navigationBarOffset { + CGFloat statusBarHeight = MIN([[UIApplication sharedApplication] statusBarFrame].size.width, [[UIApplication sharedApplication] statusBarFrame].size.height); + + return self.navigationBar ? self.navigationBar.frame.size.height + statusBarHeight : 0; +} + +- (void) updateViewOnRotate:(NSNotification*) notification { + CGFloat height = MIN([notification.object floatValue], MIN(self.viewToShowFrom.bounds.size.height - self.navigationBarOffset, self.combinedHeight)); + self.menuView.frame = CGRectMake(0, 0, self.viewToShowFrom.bounds.size.width, height); + self.menuView.contentSize = CGSizeMake(self.viewToShowFrom.bounds.size.width, self.combinedHeight); + self.menuWrapperView.frame = CGRectMake(0, self.navigationBarOffset, self.viewToShowFrom.bounds.size.width, height); } - (void)showInView:(UIView *)view @@ -313,8 +332,6 @@ - (void)showFromNavigationController:(UINavigationController *)navigationControl self.navigationBar = navigationController.navigationBar; [self showFromRect:CGRectMake(0, 0, navigationController.navigationBar.frame.size.width, navigationController.view.frame.size.height) inView:navigationController.view]; - self.containerView.appearsBehindNavigationBar = self.appearsBehindNavigationBar; - self.containerView.navigationBar = navigationController.navigationBar; if (self.appearsBehindNavigationBar) { [navigationController.view bringSubviewToFront:navigationController.navigationBar]; } @@ -388,7 +405,7 @@ - (void)close - (CGFloat)combinedHeight { - return self.items.count * self.itemHeight + self.items.count * self.separatorHeight + 40.0 + self.cornerRadius; + return self.items.count * self.itemHeight + self.items.count * self.separatorHeight + self.cornerRadius; } - (void)setNeedsLayout diff --git a/REMenu/REMenuContainerView.h b/REMenu/REMenuContainerView.h deleted file mode 100644 index 47f3492..0000000 --- a/REMenu/REMenuContainerView.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// REMenuContainerView.h -// REMenu -// -// Copyright (c) 2013 Roman Efimov (https://github.com/romaonthego) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -#import - -@interface REMenuContainerView : UIView - -@property (strong, readwrite, nonatomic) UINavigationBar *navigationBar; -@property (assign, readwrite, nonatomic) BOOL appearsBehindNavigationBar; - -@end diff --git a/REMenu/REMenuContainerView.m b/REMenu/REMenuContainerView.m deleted file mode 100644 index ce5e9a5..0000000 --- a/REMenu/REMenuContainerView.m +++ /dev/null @@ -1,51 +0,0 @@ -// -// REMenuContainerView.m -// REMenu -// -// Copyright (c) 2013 Roman Efimov (https://github.com/romaonthego) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -#import "REMenuContainerView.h" -#import - -@implementation REMenuContainerView - -- (void)layoutSubviews -{ - [super layoutSubviews]; - UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; - - CGFloat landscapeOffset = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ? 32.0 : 44.0; - - if (self.navigationBar && !self.appearsBehindNavigationBar) { - CGRect frame = self.frame; - frame.origin.y = self.navigationBar.frame.origin.y + (UIDeviceOrientationIsPortrait(orientation) ? 44.0 : landscapeOffset); - self.frame = frame; - } - - if (self.appearsBehindNavigationBar) { - CGRect frame = self.frame; - frame.origin.y = (UIDeviceOrientationIsPortrait(orientation) ? 44.0 : landscapeOffset) - 44; - self.frame = frame; - } -} - -@end diff --git a/REMenuExample/REMenuExample.xcodeproj/project.pbxproj b/REMenuExample/REMenuExample.xcodeproj/project.pbxproj index 2e7c31b..d2bc02d 100644 --- a/REMenuExample/REMenuExample.xcodeproj/project.pbxproj +++ b/REMenuExample/REMenuExample.xcodeproj/project.pbxproj @@ -24,7 +24,6 @@ 30E0F7AC16D54641001949EA /* REMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E0F7A716D54641001949EA /* REMenu.m */; }; 30E0F7AD16D54641001949EA /* REMenuItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E0F7A916D54641001949EA /* REMenuItem.m */; }; 30E0F7AE16D54641001949EA /* REMenuItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E0F7AB16D54641001949EA /* REMenuItemView.m */; }; - 30E0F7B116D54CE0001949EA /* REMenuContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E0F7B016D54CE0001949EA /* REMenuContainerView.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -59,8 +58,6 @@ 30E0F7A916D54641001949EA /* REMenuItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = REMenuItem.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 30E0F7AA16D54641001949EA /* REMenuItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REMenuItemView.h; sourceTree = ""; }; 30E0F7AB16D54641001949EA /* REMenuItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = REMenuItemView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; - 30E0F7AF16D54CE0001949EA /* REMenuContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = REMenuContainerView.h; sourceTree = ""; }; - 30E0F7B016D54CE0001949EA /* REMenuContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = REMenuContainerView.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -159,8 +156,6 @@ 30E0F7A916D54641001949EA /* REMenuItem.m */, 30E0F7AA16D54641001949EA /* REMenuItemView.h */, 30E0F7AB16D54641001949EA /* REMenuItemView.m */, - 30E0F7AF16D54CE0001949EA /* REMenuContainerView.h */, - 30E0F7B016D54CE0001949EA /* REMenuContainerView.m */, ); name = REMenu; path = ../REMenu; @@ -235,7 +230,6 @@ 30E0F7AC16D54641001949EA /* REMenu.m in Sources */, 30E0F7AD16D54641001949EA /* REMenuItem.m in Sources */, 30E0F7AE16D54641001949EA /* REMenuItemView.m in Sources */, - 30E0F7B116D54CE0001949EA /* REMenuContainerView.m in Sources */, 30B00DDB17CCFD280010D439 /* ActivityViewController.m in Sources */, 30B00DDC17CCFD280010D439 /* ExploreViewController.m in Sources */, 30B00DDD17CCFD280010D439 /* HomeViewController.m in Sources */, @@ -320,6 +314,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + ENABLE_BITCODE = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "REMenuExample/REMenuExample-Prefix.pch"; INFOPLIST_FILE = "REMenuExample/REMenuExample-Info.plist"; @@ -336,6 +331,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + ENABLE_BITCODE = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "REMenuExample/REMenuExample-Prefix.pch"; INFOPLIST_FILE = "REMenuExample/REMenuExample-Info.plist";