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