diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..611cf85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ + +SphereMenu.xcodeproj/project.xcworkspace/xcuserdata/YH.xcuserdatad/UserInterfaceState.xcuserstate + +SphereMenu.xcodeproj/xcuserdata/YH.xcuserdatad/xcschemes/SphereMenu.xcscheme + +SphereMenu.xcodeproj/xcuserdata/YH.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/README.md b/README.md index 2d84794..97a665d 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,31 @@ SphereMenu is a fun menu powered by `UIDynamicAnimator`. Inspired by [Sphere](ht To use SpereMenu, create a `SpereMenu` like this ```objective-c -UIImage *startImage = [UIImage imageNamed:@"start"]; +[SphereMenu showSphereMenuWithAnchorView:self.btn +anchorImage:[UIImage imageNamed:@"picked"] +sphereMenus:^NSArray *{ + UIImage *image1 = [UIImage imageNamed:@"icon-twitter"]; UIImage *image2 = [UIImage imageNamed:@"icon-email"]; UIImage *image3 = [UIImage imageNamed:@"icon-facebook"]; -NSArray *images = @[image1, image2, image3]; -SphereMenu *sphereMenu = [[SphereMenu alloc] initWithStartPoint:CGPointMake(160, 320) startImage:startImage submenuImages:images]; -sphereMenu.delegate = self; -[self.view addSubview:sphereMenu]; + +UIImage *image4 = [UIImage imageNamed:@"icon-twitter"]; +UIImage *image5 = [UIImage imageNamed:@"icon-email"]; +UIImage *image6 = [UIImage imageNamed:@"icon-facebook"]; + +NSArray *images = @[@{key_sphere_menu_image:image1, key_sphere_menu_title:@"我想买"}, +@{key_sphere_menu_image:image2, key_sphere_menu_title:@"大规模有"}, +@{key_sphere_menu_image:image3, key_sphere_menu_title:@"暗黑破神"}, +@{key_sphere_menu_image:image4, key_sphere_menu_title:@"大规木有"}, +@{key_sphere_menu_image:image5, key_sphere_menu_title:@"大规木有"}, +@{key_sphere_menu_image:image6, key_sphere_menu_title:@"模有木有"}]; + +return images; +} +pickedMenu:^(NSInteger index, UIView *menu) { + +NSLog(@"picked index = %ld", index); +}]; ``` ## A Quick Peek diff --git a/SphereMenu.xcodeproj/xcuserdata/YH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SphereMenu.xcodeproj/xcuserdata/YH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/SphereMenu.xcodeproj/xcuserdata/YH.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/SphereMenu/Base.lproj/Main_iPhone.storyboard b/SphereMenu/Base.lproj/Main_iPhone.storyboard index ce2c658..ecaa900 100644 --- a/SphereMenu/Base.lproj/Main_iPhone.storyboard +++ b/SphereMenu/Base.lproj/Main_iPhone.storyboard @@ -1,10 +1,11 @@ - + - + + - + @@ -15,16 +16,35 @@ + + + + + + + + + + + - - - - - + + + diff --git a/SphereMenu/Images.xcassets/AppIcon.appiconset/Contents.json b/SphereMenu/Images.xcassets/AppIcon.appiconset/Contents.json index 91bf9c1..eeea76c 100644 --- a/SphereMenu/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SphereMenu/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,16 +5,31 @@ "size" : "29x29", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -44,6 +59,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/SphereMenu/Images.xcassets/Contents.json b/SphereMenu/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/SphereMenu/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SphereMenu/Images.xcassets/icon-email.imageset/Contents.json b/SphereMenu/Images.xcassets/icon-email.imageset/Contents.json index 693931a..a0fa129 100644 --- a/SphereMenu/Images.xcassets/icon-email.imageset/Contents.json +++ b/SphereMenu/Images.xcassets/icon-email.imageset/Contents.json @@ -6,8 +6,12 @@ }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "icon-email@2x.png" + "filename" : "icon-email@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/SphereMenu/Images.xcassets/icon-facebook.imageset/Contents.json b/SphereMenu/Images.xcassets/icon-facebook.imageset/Contents.json index 6d932b5..3a7244e 100644 --- a/SphereMenu/Images.xcassets/icon-facebook.imageset/Contents.json +++ b/SphereMenu/Images.xcassets/icon-facebook.imageset/Contents.json @@ -6,8 +6,12 @@ }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "icon-facebook@2x.png" + "filename" : "icon-facebook@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/SphereMenu/Images.xcassets/icon-twitter.imageset/Contents.json b/SphereMenu/Images.xcassets/icon-twitter.imageset/Contents.json index 9c0072c..1ae5211 100644 --- a/SphereMenu/Images.xcassets/icon-twitter.imageset/Contents.json +++ b/SphereMenu/Images.xcassets/icon-twitter.imageset/Contents.json @@ -6,8 +6,12 @@ }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "icon-twitter@2x.png" + "filename" : "icon-twitter@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/SphereMenu/Images.xcassets/picked.imageset/Contents.json b/SphereMenu/Images.xcassets/picked.imageset/Contents.json new file mode 100644 index 0000000..4d5649d --- /dev/null +++ b/SphereMenu/Images.xcassets/picked.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "start_selected@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SphereMenu/Images.xcassets/picked.imageset/start_selected@2x.png b/SphereMenu/Images.xcassets/picked.imageset/start_selected@2x.png new file mode 100644 index 0000000..739931a Binary files /dev/null and b/SphereMenu/Images.xcassets/picked.imageset/start_selected@2x.png differ diff --git a/SphereMenu/Images.xcassets/start.imageset/Contents.json b/SphereMenu/Images.xcassets/start.imageset/Contents.json index 4244c00..5b01f6b 100644 --- a/SphereMenu/Images.xcassets/start.imageset/Contents.json +++ b/SphereMenu/Images.xcassets/start.imageset/Contents.json @@ -6,8 +6,12 @@ }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "start@2x.png" + "filename" : "start@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" } ], "info" : { diff --git a/SphereMenu/Launch Screen.xib b/SphereMenu/Launch Screen.xib index ba322fc..7556d9f 100644 --- a/SphereMenu/Launch Screen.xib +++ b/SphereMenu/Launch Screen.xib @@ -1,7 +1,8 @@ - + - + + diff --git a/SphereMenu/SphereMenu/SphereMenu.h b/SphereMenu/SphereMenu/SphereMenu.h index e2e362d..93e5a1d 100644 --- a/SphereMenu/SphereMenu/SphereMenu.h +++ b/SphereMenu/SphereMenu/SphereMenu.h @@ -2,29 +2,21 @@ // SphereMenu.h // SphereMenu // -// Created by Tu You on 14-8-24. -// Copyright (c) 2014年 TU YOU. All rights reserved. -// #import -@protocol SphereMenuDelegate - -- (void)sphereDidSelected:(int)index; - -@end -@interface SphereMenu : UIView +typedef void (^SpherePickedMenu)(NSInteger index, UIView *menu); -- (instancetype)initWithStartPoint:(CGPoint)startPoint - startImage:(UIImage *)startImage - submenuImages:(NSArray *)images; +#define key_sphere_menu_image @"img" +#define key_sphere_menu_title @"title" -@property (nonatomic, weak) id delegate; -@property (nonatomic, assign) CGFloat angle; -@property (nonatomic, assign) CGFloat sphereDamping; -@property (nonatomic, assign) CGFloat sphereLength; +@interface SphereMenu : UIView ++ (instancetype)showSphereMenuWithAnchorView:(UIView *)anchorView + anchorImage:(UIImage *)anchorImg + sphereMenus:(NSArray *(^)())menus + pickedMenu:(SpherePickedMenu)completion; @end diff --git a/SphereMenu/SphereMenu/SphereMenu.m b/SphereMenu/SphereMenu/SphereMenu.m index 334f9dc..101fbe5 100644 --- a/SphereMenu/SphereMenu/SphereMenu.m +++ b/SphereMenu/SphereMenu/SphereMenu.m @@ -2,22 +2,63 @@ // SphereMenu.m // SphereMenu // -// Created by Tu You on 14-8-24. -// Copyright (c) 2014年 TU YOU. All rights reserved. -// #import "SphereMenu.h" -static const int kItemInitTag = 1001; static const CGFloat kAngleOffset = M_PI_2 / 2; -static const CGFloat kSphereLength = 80; +static const CGFloat kSphereLength = 150; static const float kSphereDamping = 0.3; -@interface SphereMenu () -@property (nonatomic, assign) NSUInteger count ; -@property (nonatomic, strong) UIImageView *start; -@property (nonatomic, strong) NSArray *images; + +@protocol SphereModelViewDelegate + +@optional +- (void)modelMenuViewDidTouchEnd:(id)menuView; + +@end + + +@interface SphereModelView : UIView + +@property (nonatomic) id delegate; + +@end + + +@implementation SphereModelView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + + self.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.3]; + } + + return self; +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + if ([self.delegate respondsToSelector:@selector(modelMenuViewDidTouchEnd:)]) { + + [self.delegate modelMenuViewDidTouchEnd:self]; + } +} + +@end + + + + +@interface SphereMenu () + + +@property (nonatomic, assign) CGFloat angle; +@property (nonatomic, assign) CGFloat sphereDamping; +@property (nonatomic, assign) CGFloat sphereLength; + @property (nonatomic, strong) NSMutableArray *items; @property (nonatomic, strong) NSMutableArray *positions; @@ -27,63 +68,190 @@ @interface SphereMenu () @property (nonatomic, strong) UIDynamicItemBehavior *itemBehavior; @property (nonatomic, strong) NSMutableArray *snaps; -@property (nonatomic, strong) UITapGestureRecognizer *tapOnStart; - @property (nonatomic, strong) id bumper; @property (nonatomic, assign) BOOL expanded; + + +// -- add by Olive + +@property (nonatomic, strong) UIView *anchorView; + +@property (nonatomic, strong) UIImage *normalImage; + +@property (nonatomic, strong) UIButton *anchorBtn; + +@property (nonatomic, strong) SphereModelView *modelView; + +@property (nonatomic, strong) NSArray *menusViewArray; + +@property (nonatomic, strong) SpherePickedMenu pickedCompletion; + +// -- end by Olive + @end @implementation SphereMenu -- (instancetype)initWithStartPoint:(CGPoint)startPoint startImage:(UIImage *)startImage submenuImages:(NSArray *)images + ++ (instancetype)showSphereMenuWithAnchorView:(UIView *)anchorView + anchorImage:(UIImage *)anchorImg + sphereMenus:(NSArray *(^)())menus + pickedMenu:(SpherePickedMenu)completion { - if (self = [super init]) { - - self.bounds = CGRectMake(0, 0, startImage.size.width, startImage.size.height); - self.center = startPoint; + SphereMenu *menu = [[SphereMenu alloc] init]; + menu.menusViewArray = menus(); + menu.anchorView = anchorView; + menu.pickedCompletion = completion; + + menu.normalImage = anchorImg; + + [menu show]; + + + return menu; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { _angle = kAngleOffset; _sphereLength = kSphereLength; _sphereDamping = kSphereDamping; - - _images = images; - _count = self.images.count; - _start = [[UIImageView alloc] initWithImage:startImage]; - _start.userInteractionEnabled = YES; - _tapOnStart = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(startTapped:)]; - [_start addGestureRecognizer:_tapOnStart]; - [self addSubview:_start]; } + return self; } +- (UIWindow *)window +{ + return [[UIApplication sharedApplication] keyWindow]; +} + +- (SphereModelView *)modelView +{ + if (!_modelView) { + + _modelView = [[SphereModelView alloc] initWithFrame:self.window.bounds]; + _modelView.delegate = self; + } + + return _modelView; +} + +- (void)show +{ + //self.anchorView.hidden = YES; + + _angle = M_PI / (self.menusViewArray.count+1); + + [self.window addSubview:self.modelView]; + + self.modelView.frame = CGRectMake(0, self.modelView.bounds.size.height, self.modelView.bounds.size.width, 0); + [UIView animateWithDuration:_sphereDamping + animations:^{ + + self.modelView.frame = self.window.bounds; + } + completion:^(BOOL finished) { + + + }]; + + //NSLog(@"anchor ori frame = %@", NSStringFromCGRect(self.anchorView.frame)); + CGRect rect = [self.anchorView.superview convertRect:self.anchorView.frame toView:self.window]; + //NSLog(@"rect = %@", NSStringFromCGRect(rect)); + + self.frame = rect; + + + UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; + btn.frame = self.bounds; + [btn setImage:self.normalImage forState:UIControlStateNormal]; + [btn addTarget:self action:@selector(anchorBtnAction:) forControlEvents:UIControlEventTouchUpInside]; + [self addSubview:btn]; + + [self.window addSubview:self]; + + + [self commonSetup]; + + [self expandSubmenu]; +} + +#pragma mark -Action +- (void)anchorBtnAction:(UIButton *)sender +{ + [self shrinkSubmenu:^{ + + }]; +} + +- (void)menuItemPickedAction:(UIControl *)sender +{ + [self shrinkSubmenu:^{ + + if (self.pickedCompletion) { + + NSInteger i = sender.tag; + self.pickedCompletion(i, sender); + } + }]; +} + +#pragma mark -Private Methods +#define SPHERE_TITLE_LABEL_HEIGHT 30 - (void)commonSetup { self.items = [NSMutableArray array]; self.positions = [NSMutableArray array]; self.snaps = [NSMutableArray array]; + CGRect rect = CGRectZero; + + NSInteger count = self.menusViewArray.count; // setup the items - for (int i = 0; i < self.count; i++) { - UIImageView *item = [[UIImageView alloc] initWithImage:self.images[i]]; - item.tag = kItemInitTag + i; - item.userInteractionEnabled = YES; - [self.superview addSubview:item]; + for (int i = 0; i < count; i++) { - CGPoint position = [self centerForSphereAtIndex:i]; - item.center = self.center; - [self.positions addObject:[NSValue valueWithCGPoint:position]]; + UIImage *img = self.menusViewArray[i][key_sphere_menu_image]; + NSString *title = self.menusViewArray[i][key_sphere_menu_title]; + + rect.size.width = img.size.width; + rect.size.height = img.size.height + SPHERE_TITLE_LABEL_HEIGHT; - UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; - [item addGestureRecognizer:tap]; + UIControl *view = [[UIControl alloc] initWithFrame:rect]; + view.tag = i; + view.backgroundColor = [UIColor clearColor]; + [view addTarget:self action:@selector(menuItemPickedAction:) forControlEvents:UIControlEventTouchUpInside]; - UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)]; - [item addGestureRecognizer:pan]; + UIImageView *imgView = [[UIImageView alloc] initWithImage:img]; + imgView.frame = CGRectMake(0, 0, img.size.width, img.size.height); + [view addSubview:imgView]; - [self.items addObject:item]; + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, img.size.height, img.size.width, SPHERE_TITLE_LABEL_HEIGHT)]; + label.backgroundColor = [UIColor clearColor]; + label.text = title; + label.font = [UIFont systemFontOfSize:11]; + label.textAlignment = NSTextAlignmentCenter; + label.textColor = [UIColor whiteColor]; +// label.adjustsFontSizeToFitWidth = YES; + [view addSubview:label]; + + view.center = self.center; + + [self.superview addSubview:view]; + + CGPoint position = [self centerForSphereAtIndex:i]; + view.center = self.center; + [self.positions addObject:[NSValue valueWithCGPoint:position]]; + + // UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)]; + // [view addGestureRecognizer:pan]; + + [self.items addObject:view]; } [self.superview bringSubviewToFront:self]; @@ -95,7 +263,7 @@ - (void)commonSetup self.collision.translatesReferenceBoundsIntoBoundary = YES; self.collision.collisionDelegate = self; - for (int i = 0; i < self.count; i++) { + for (int i = 0; i < count; i++) { UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.items[i] snapToPoint:self.center]; snap.damping = self.sphereDamping; [self.snaps addObject:snap]; @@ -111,111 +279,83 @@ - (void)commonSetup self.itemBehavior.friction = 0.5; } -- (void)didMoveToSuperview +- (void)removeAllSubViews:(void (^)())completion { - [self commonSetup]; -} - -- (void)removeFromSuperview -{ - for (int i = 0; i < self.count; i++) { - [self.items[i] removeFromSuperview]; - } - - [super removeFromSuperview]; + [UIView animateWithDuration:_sphereDamping + animations:^{ + + self.modelView.frame = CGRectMake(0, self.modelView.bounds.size.height, self.modelView.bounds.size.width, 0); + } + completion:^(BOOL finished) { + + [self.modelView removeFromSuperview]; + + for (UIView *view in self.items) { + [view removeFromSuperview]; + } + [self removeFromSuperview]; + + completion(); + }]; } - (CGPoint)centerForSphereAtIndex:(int)index { - CGFloat firstAngle = M_PI + (M_PI_2 - self.angle) + index * self.angle; + CGFloat cosAngle = 0; + if (index*self.angle > M_PI_4) + cosAngle = M_PI - (index+1)*self.angle; + else + cosAngle = M_PI_2 + (M_PI_2 - (index+1)*self.angle); + + CGFloat sinAngle = (index+1)*self.angle; + +// CGFloat firstAngle = M_PI + (M_PI_4 - self.angle) + index * self.angle; CGPoint startPoint = self.center; - CGFloat x = startPoint.x + cos(firstAngle) * self.sphereLength; - CGFloat y = startPoint.y + sin(firstAngle) * self.sphereLength; + CGFloat x = startPoint.x + cos(cosAngle) * self.sphereLength; + //NSLog(@"start x = %f, index = %d, x = %f", startPoint.x, index, x); + CGFloat y = startPoint.y - sin(sinAngle) * self.sphereLength; + //NSLog(@"start y = %f, index = %d, y = %f", startPoint.y, index, y); CGPoint position = CGPointMake(x, y); return position; } -- (void)tapped:(UITapGestureRecognizer *)gesture -{ - if ([self.delegate respondsToSelector:@selector(sphereDidSelected:)]) { - int tag = (int)gesture.view.tag; - tag -= kItemInitTag; - [self.delegate sphereDidSelected:tag]; - } - - [self shrinkSubmenu]; -} - -- (void)startTapped:(UITapGestureRecognizer *)gesture -{ - [self.animator removeBehavior:self.collision]; - [self.animator removeBehavior:self.itemBehavior]; - [self removeSnapBehaviors]; - - if (self.expanded) { - [self shrinkSubmenu]; - } else { - [self expandSubmenu]; - } -} - +// TODO: --展开menu - (void)expandSubmenu { - for (int i = 0; i < self.count; i++) { + for (int i = 0; i < self.items.count; i++) { [self snapToPostionsWithIndex:i]; } self.expanded = YES; } -- (void)shrinkSubmenu +- (void)snapToPostionsWithIndex:(NSUInteger)index +{ + id positionValue = self.positions[index]; + CGPoint position = [positionValue CGPointValue]; + UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.items[index] snapToPoint:position]; + snap.damping = self.sphereDamping; + UISnapBehavior *snapToRemove = self.snaps[index]; + self.snaps[index] = snap; + [self.animator removeBehavior:snapToRemove]; + [self.animator addBehavior:snap]; +} + +// TODO: --关闭menu +- (void)shrinkSubmenu:(void (^)())completion { [self.animator removeBehavior:self.collision]; - for (int i = 0; i < self.count; i++) { + for (int i = 0; i < self.items.count; i++) { [self snapToStartWithIndex:i]; } - self.expanded = NO; -} - -- (void)panned:(UIPanGestureRecognizer *)gesture -{ - UIView *touchedView = gesture.view; - if (gesture.state == UIGestureRecognizerStateBegan) { - [self.animator removeBehavior:self.itemBehavior]; - [self.animator removeBehavior:self.collision]; - [self removeSnapBehaviors]; - } else if (gesture.state == UIGestureRecognizerStateChanged) { - touchedView.center = [gesture locationInView:self.superview]; - } else if (gesture.state == UIGestureRecognizerStateEnded) { - self.bumper = touchedView; - [self.animator addBehavior:self.collision]; - NSUInteger index = [self.items indexOfObject:touchedView]; - - if (index != NSNotFound) { - [self snapToPostionsWithIndex:index]; - } - } -} - -- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id)item1 withItem:(id)item2 -{ - [self.animator addBehavior:self.itemBehavior]; - if (item1 != self.bumper) { - NSUInteger index = (int)[self.items indexOfObject:item1]; - if (index != NSNotFound) { - [self snapToPostionsWithIndex:index]; - } - } - if (item2 != self.bumper) { - NSUInteger index = (int)[self.items indexOfObject:item2]; - if (index != NSNotFound) { - [self snapToPostionsWithIndex:index]; - } - } + [self removeAllSubViews:^{ + + completion(); + }]; } - (void)snapToStartWithIndex:(NSUInteger)index @@ -228,18 +368,6 @@ - (void)snapToStartWithIndex:(NSUInteger)index [self.animator addBehavior:snap]; } -- (void)snapToPostionsWithIndex:(NSUInteger)index -{ - id positionValue = self.positions[index]; - CGPoint position = [positionValue CGPointValue]; - UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.items[index] snapToPoint:position]; - snap.damping = self.sphereDamping; - UISnapBehavior *snapToRemove = self.snaps[index]; - self.snaps[index] = snap; - [self.animator removeBehavior:snapToRemove]; - [self.animator addBehavior:snap]; -} - - (void)removeSnapBehaviors { [self.snaps enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -247,4 +375,12 @@ - (void)removeSnapBehaviors }]; } +#pragma mark -SphereModelViewDelegate +- (void)modelMenuViewDidTouchEnd:(id)menuView +{ + [self shrinkSubmenu:^{ + + }]; +} + @end diff --git a/SphereMenu/ViewController.m b/SphereMenu/ViewController.m index ea54b1b..b63111a 100644 --- a/SphereMenu/ViewController.m +++ b/SphereMenu/ViewController.m @@ -9,7 +9,9 @@ #import "ViewController.h" #import "SphereMenu.h" -@interface ViewController () +@interface ViewController () + +@property (nonatomic, weak) IBOutlet UIButton *btn; @end @@ -21,18 +23,18 @@ - (void)viewDidLoad self.view.backgroundColor = [UIColor colorWithRed:1 green:0.58 blue:0.27 alpha:1]; - UIImage *startImage = [UIImage imageNamed:@"start"]; - UIImage *image1 = [UIImage imageNamed:@"icon-twitter"]; - UIImage *image2 = [UIImage imageNamed:@"icon-email"]; - UIImage *image3 = [UIImage imageNamed:@"icon-facebook"]; - NSArray *images = @[image1, image2, image3]; - SphereMenu *sphereMenu = [[SphereMenu alloc] initWithStartPoint:CGPointMake(CGRectGetWidth(self.view.frame) / 2, 320) - startImage:startImage - submenuImages:images]; - sphereMenu.sphereDamping = 0.3; - sphereMenu.sphereLength = 85; - sphereMenu.delegate = self; - [self.view addSubview:sphereMenu]; +// UIImage *startImage = [UIImage imageNamed:@"start"]; +// UIImage *image1 = [UIImage imageNamed:@"icon-twitter"]; +// UIImage *image2 = [UIImage imageNamed:@"icon-email"]; +// UIImage *image3 = [UIImage imageNamed:@"icon-facebook"]; +// NSArray *images = @[image1, image2, image3]; +// SphereMenu *sphereMenu = [[SphereMenu alloc] initWithStartPoint:CGPointMake(CGRectGetWidth(self.view.frame) / 2, 320) +// startImage:startImage +// submenuImages:images]; +// sphereMenu.sphereDamping = 0.3; +// sphereMenu.sphereLength = 85; +// sphereMenu.delegate = self; +// [self.view addSubview:sphereMenu]; } - (void)sphereDidSelected:(int)index @@ -50,4 +52,36 @@ - (UIStatusBarStyle)preferredStatusBarStyle return UIStatusBarStyleLightContent; } +- (IBAction)startBtnAction:(id)sender +{ + [SphereMenu showSphereMenuWithAnchorView:self.btn + anchorImage:[UIImage imageNamed:@"picked"] + sphereMenus:^NSArray *{ + + UIImage *image1 = [UIImage imageNamed:@"icon-twitter"]; + UIImage *image2 = [UIImage imageNamed:@"icon-email"]; + UIImage *image3 = [UIImage imageNamed:@"icon-facebook"]; + + UIImage *image4 = [UIImage imageNamed:@"icon-twitter"]; + UIImage *image5 = [UIImage imageNamed:@"icon-email"]; + UIImage *image6 = [UIImage imageNamed:@"icon-facebook"]; + + NSArray *images = @[@{key_sphere_menu_image:image1, key_sphere_menu_title:@"我想买"}, + @{key_sphere_menu_image:image2, key_sphere_menu_title:@"大规模有"}, + @{key_sphere_menu_image:image3, key_sphere_menu_title:@"暗黑破神"}, + @{key_sphere_menu_image:image4, key_sphere_menu_title:@"大规木有"}, + @{key_sphere_menu_image:image5, key_sphere_menu_title:@"大规木有"}, + @{key_sphere_menu_image:image6, key_sphere_menu_title:@"模有木有"}]; + + return images; + } + pickedMenu:^(NSInteger index, UIView *menu) { + + NSLog(@"picked index = %ld", index); + }]; + + + +} + @end