Skip to content

Commit

Permalink
Merge pull request #6 from tomhoffen/master
Browse files Browse the repository at this point in the history
Added left to right menu opening support
  • Loading branch information
Eke authored Jun 24, 2016
2 parents e786fad + 09b1cc3 commit bdf8364
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 17 deletions.
7 changes: 7 additions & 0 deletions Pod/Classes/EMEmojiableBtn.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,13 @@
#import "EMEmojiableOption.h"
#import "EMEmojiableBtnConfig.h"

typedef NS_ENUM(NSInteger, MenuDirection) {
MenuDirectionUpRight,
MenuDirectionUpLeft,
MenuDirectionDownRight,
MenuDirectionDownLeft,
};

@protocol EMEmojiableBtnDelegate;
@interface EMEmojiableBtn : UIButton
@property (strong,nonatomic) NSArray * _Nonnull dataset;
Expand Down
110 changes: 93 additions & 17 deletions Pod/Classes/EMEmojiableBtn.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ @interface EMEmojiableBtn()
@property (strong,nonatomic) UITapGestureRecognizer *singleTapGesture;
@property (strong,nonatomic) UILongPressGestureRecognizer *longPressGesture;
@property (assign,nonatomic) BOOL active;
@property (assign,nonatomic) MenuDirection menuDirection;
@property (assign,nonatomic) CGPoint origin;
@property (assign,nonatomic) CGRect optionsViewOriginalRect;
@property (assign,nonatomic) int selectedItem;
Expand All @@ -30,6 +31,7 @@ @implementation EMEmojiableBtn{
@synthesize longPressGesture;
@synthesize singleTapGesture;
@synthesize active;
@synthesize menuDirection;
@synthesize origin;
@synthesize informationView;
@synthesize selectedItem;
Expand Down Expand Up @@ -93,6 +95,7 @@ - (void)activate{

CGRect selectorViewFrame = [UIScreen mainScreen].bounds;
origin = [self.superview convertPoint:self.frame.origin toView:nil];
menuDirection = [self getMenuDirection];

if (!CGPointEqualToPoint(origin,self.frame.origin)) {
selectorViewFrame.origin.x -= origin.x;
Expand All @@ -107,7 +110,8 @@ - (void)activate{
CGFloat buttonHeight = self.config.size+(2*self.config.spacing);
CGSize sizeBtn = CGSizeMake(buttonWidth,buttonHeight);

CGRect optionsViewFrame = CGRectMake(origin.x, origin.y - sizeBtn.height, sizeBtn.width, sizeBtn.height);

CGRect optionsViewFrame = [self adjustFrameIfNeeded:CGRectMake(origin.x, origin.y - sizeBtn.height, sizeBtn.width, sizeBtn.height) leftMenuXOrigin:(origin.x + self.frame.size.width - sizeBtn.width) downMenuYOrigin:0.0];

optionsView = [[UIView alloc] initWithFrame:optionsViewFrame];
optionsView.alpha = self.config.optionsViewInitialAlpha;
Expand All @@ -128,12 +132,19 @@ - (void)activate{

for (int i = 0; i<_dataset.count;++i){
EMEmojiableOption *option = [_dataset objectAtIndex:i];
UIImageView *optionImageView = [[UIImageView alloc] initWithFrame:CGRectMake(((CGFloat)(i+1)*self.config.spacing)+(self.config.size*(CGFloat)i),sizeBtn.height*1.2,10,10)];
CGRect frame = CGRectMake(((CGFloat)(i+1)*self.config.spacing)+(self.config.size*(CGFloat)i),sizeBtn.height*1.2,10,10);
CGPoint center = CGPointMake(((CGFloat)(i+1)*self.config.spacing)+(self.config.size*(CGFloat)i)+self.config.size/2.0,self.config.spacing+self.config.size/2.0);


UIImageView *optionImageView = [[UIImageView alloc] initWithFrame: [self adjustFrameIfNeeded:frame leftMenuXOrigin:(optionsView.frame.size.width - frame.origin.x) downMenuYOrigin:0.0]];
CGPoint centerPoint = [self adjustPointIfNeeded:center leftMenuX:(optionsView.frame.size.width - center.x) downMenuY:0.0];


optionImageView.image = [UIImage imageNamed:option.imageName];
optionImageView.alpha = 0.6;
[optionsView addSubview:optionImageView];

CGPoint centerPoint = CGPointMake(((CGFloat)(i+1)*self.config.spacing)+(self.config.size*(CGFloat)i)+self.config.size/2.0,self.config.spacing+self.config.size/2.0);


[UIView animateWithDuration:0.2 delay:0.05*(double)i options:UIViewAnimationOptionCurveEaseInOut animations:^{
CGRect optionImageViewFrame = optionImageView.frame;
Expand Down Expand Up @@ -163,16 +174,21 @@ - (void)deActivate:(int)optionIndex{

[optionsView.subviews enumerateObjectsUsingBlock:^(UIView *option, NSUInteger idx, BOOL *stop) {
[UIView animateWithDuration:0.2 delay:0.05*(double)idx options:UIViewAnimationOptionCurveEaseInOut animations:^{
CGPoint center;
CGRect optionFrame = option.frame;
optionFrame.size = CGSizeMake(10.0,10.0);
informationView.alpha = 0;
option.alpha = 0.3;
option.frame = optionFrame;
if(optionIndex == idx){
option.center = CGPointMake(((CGFloat)idx+1.0*self.config.spacing)+(self.config.size*idx)+self.config.size/2,-self.optionsView.frame.size.height+self.config.size/2.0);
center = CGPointMake(((CGFloat)idx+1.0*self.config.spacing)+(self.config.size*idx)+self.config.size/2,-self.optionsView.frame.size.height+self.config.size/2.0);
option.center = [self adjustPointIfNeeded:center leftMenuX:(optionsView.frame.size.width - center.x) downMenuY:0.0];

}else{
option.center = CGPointMake(((CGFloat)idx+1.0*self.config.spacing)+(self.config.size*(CGFloat)idx)+self.config.size/2.0, self.optionsView.frame.size.height+self.config.size/2.0);
center = CGPointMake(((CGFloat)idx+1.0*self.config.spacing)+(self.config.size*(CGFloat)idx)+self.config.size/2.0, self.optionsView.frame.size.height+self.config.size/2.0);
option.center = [self adjustPointIfNeeded:center leftMenuX:(optionsView.frame.size.width - center.x) downMenuY:0.0];
}

} completion:^(BOOL finished) {
if (finished && idx == (_dataset.count/2)){
[UIView animateWithDuration:0.1 animations:^{
Expand Down Expand Up @@ -202,29 +218,85 @@ - (void)selectIndex:(int)index{
CGFloat buttonHeight = self.config.minSize+(2*self.config.spacing);
CGSize sizeBtn = CGSizeMake(buttonWidth,buttonHeight);

optionsView.frame = CGRectMake(self.origin.x, self.origin.y - (self.config.s_options_selector+sizeBtn.height), sizeBtn.width, sizeBtn.height);
optionsView.frame = [self adjustFrameIfNeeded:CGRectMake(self.origin.x, self.origin.y - (self.config.s_options_selector+sizeBtn.height), sizeBtn.width, sizeBtn.height) leftMenuXOrigin:(self.origin.x + self.frame.size.width - sizeBtn.width) downMenuYOrigin:0.0];
optionsView.layer.cornerRadius = sizeBtn.height/2;

__block CGFloat last = index != 0 ? self.config.spacing : 0;

[optionsView.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
CGRect frame;
CGPoint center;
if(idx == index-1){
view.frame = CGRectMake(last,self.config.spacing,self.config.minSize,self.config.minSize);
view.center = CGPointMake(view.center.x, (self.config.minSize/2) + self.config.spacing);
frame = CGRectMake(last,self.config.spacing,self.config.minSize,self.config.minSize);
view.frame = [self adjustFrameIfNeeded:frame leftMenuXOrigin:(optionsView.frame.size.width - self.config.minSize - last) downMenuYOrigin:0.0];
center = CGPointMake(view.center.x, (self.config.minSize/2) + self.config.spacing);
view.center = [self adjustPointIfNeeded:center leftMenuX:view.center.x downMenuY:0.0];
last += self.config.minSize;

}else if(idx == index){
view.frame = CGRectMake(last, -(self.config.maxSize/2), self.config.maxSize, self.config.maxSize);
last += self.config.maxSize;
}else{
view.frame = CGRectMake(last,self.config.spacing,self.config.minSize,self.config.minSize);
view.center = CGPointMake(view.center.x, (self.config.minSize/2) + self.config.spacing);
frame = CGRectMake(last, -(self.config.maxSize/2), self.config.maxSize, self.config.maxSize);
view.frame = [self adjustFrameIfNeeded:frame leftMenuXOrigin:(optionsView.frame.size.width - self.config.maxSize - last) downMenuYOrigin:0.0];
last += self.config.maxSize;
}else {
frame = CGRectMake(last,self.config.spacing,self.config.minSize,self.config.minSize);
view.frame = [self adjustFrameIfNeeded:frame leftMenuXOrigin:(optionsView.frame.size.width - self.config.minSize - last) downMenuYOrigin:0.0];
center = CGPointMake(view.center.x, (self.config.minSize/2) + self.config.spacing);
view.center = [self adjustPointIfNeeded:center leftMenuX:view.center.x downMenuY:0.0];
last += self.config.minSize + self.config.spacing;
}

}];
}];
}

- (CGRect)adjustFrameIfNeeded: (CGRect)frame leftMenuXOrigin:(CGFloat)x downMenuYOrigin:(CGFloat)y{
CGRect adjustedFrame;
if (menuDirection == MenuDirectionUpRight){
adjustedFrame = frame;
} else if (menuDirection == MenuDirectionUpLeft) {
adjustedFrame = CGRectMake(x, frame.origin.y, frame.size.width, frame.size.height);
} else if (menuDirection == MenuDirectionDownRight) {
adjustedFrame = CGRectMake(frame.origin.x, y, frame.size.width, frame.size.height);
} else if (menuDirection == MenuDirectionDownLeft) {
adjustedFrame = CGRectMake(x, y, frame.size.width, frame.size.height);
}

return adjustedFrame;
}

- (CGPoint)adjustPointIfNeeded: (CGPoint)point leftMenuX:(CGFloat)x downMenuY:(CGFloat)y{
CGPoint adjustedPoint;
if (menuDirection == MenuDirectionUpRight){
adjustedPoint = point;
} else if (menuDirection == MenuDirectionUpLeft) {
adjustedPoint = CGPointMake(x, point.y);
} else if (menuDirection == MenuDirectionDownRight) {
adjustedPoint = CGPointMake(point.x, y);
} else if (menuDirection == MenuDirectionDownLeft) {
adjustedPoint = CGPointMake(x, y);
}

return adjustedPoint;
}

- (MenuDirection)getMenuDirection{
CGFloat center = self.superview.center.x;
CGFloat top = 0;

if (origin.x <= center && origin.y > top) {
return MenuDirectionUpRight;
}
else if (origin.x > center && origin.y > top) {
return MenuDirectionUpLeft;
}
else if (origin.x <= center && origin.y <= top) {
return MenuDirectionDownRight;
}
else {
return MenuDirectionDownLeft;
}
}

- (void)looseFocus{
selectedItem = -1;
[informationView activateInfo:YES];
Expand All @@ -236,7 +308,8 @@ - (void)looseFocus{
optionsView.layer.cornerRadius = sizeBtn.height/2.0;

[optionsView.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
view.frame = CGRectMake(((CGFloat)(idx+1)*self.config.spacing)+(self.config.size*(CGFloat)idx),self.config.spacing,self.config.size,self.config.size);
CGRect frame = CGRectMake(((CGFloat)(idx+1)*self.config.spacing)+(self.config.size*(CGFloat)idx),self.config.spacing,self.config.size,self.config.size);
view.frame = [self adjustFrameIfNeeded:frame leftMenuXOrigin:(optionsView.frame.size.width - self.config.size - frame.origin.x) downMenuYOrigin:0.0];
}];
}];
}
Expand All @@ -258,18 +331,21 @@ - (void)longTap:(UIGestureRecognizer*)gesture{
if (point.y < (CGRectGetMinY(optionsView.frame) - 50) || point.y > (CGRectGetMaxY(informationView.frame) + 30)){
[self looseFocus];
}else{
if (point.x-origin.x > 0 && point.x < CGRectGetMaxX(optionsView.frame)-30){
if ((menuDirection == MenuDirectionUpRight) && ((point.x-origin.x) > 0 && point.x < (CGRectGetMaxX(optionsView.frame)-30))) {
int selected = round((point.x-origin.x)/t);
[self selectIndex:selected];
}else if ((menuDirection == MenuDirectionUpLeft) && ((origin.x + self.frame.size.width - point.x) > 0 && point.x > (CGRectGetMinX(optionsView.frame) + 30))) {
int selected = round((origin.x + self.frame.size.width - point.x)/t);
[self selectIndex:selected];
}else{
[self looseFocus];
}
}

}
else if (gesture.state == UIGestureRecognizerStateEnded){
CGPoint point = [gesture locationInView:selectorBgView];
if (point.x > 0 && point.x < CGRectGetMaxX(optionsView.frame)){
if (((menuDirection == MenuDirectionUpRight) && (point.x > 0 && point.x < CGRectGetMaxX(optionsView.frame))) ||
((menuDirection == MenuDirectionUpLeft) && (point.x < selectorBgView.frame.size.width && point.x > CGRectGetMinX(optionsView.frame)))) {
[self deActivate:selectedItem];
}else{
[self deActivate:-1];
Expand Down

0 comments on commit bdf8364

Please sign in to comment.