模仿淘宝下拉菜单

效果图:

h文件

//
//  YLDropDownMenuView.h
//  YangLand
//
//  Created by point on 16/3/24.
//  Copyright © 2016年 tshiny. All rights reserved.
//

#import "BaseView.h"

@class YLDropDownMenuView;

@protocol YLDropDownMenuViewDelegate <NSObject>
@optional
- (void)dropdownMenuDidDismiss:(YLDropDownMenuView *)menu;
- (void)dropdownMenuDidShow:(YLDropDownMenuView *)menu;
@end

@interface YLDropDownMenuView : BaseView

@property (nonatomic, weak) id<YLDropDownMenuViewDelegate> delegate;
/**
 *  创建菜单
 */
+(instancetype)menu;

/**
 *  显示菜单
 */
-(void)showFrom:(UIView*)from;

/**
 *  移除菜单
 */
-(void)dismiss;

@property (nonatomic, strong) UIViewController *contentController;

@property (nonatomic, strong) UIView *content;

@end

@interface TriangleView : UIView

@end


m文件

//
//  YLDropDownMenuView.m
//  YangLand
//
//  Created by point on 16/3/24.
//  Copyright © 2016年 tshiny. All rights reserved.
//

#import "YLDropDownMenuView.h"

@interface YLDropDownMenuView()

@property (nonatomic, weak) UIView *containerView;

@property (nonatomic, strong) TriangleView *triang;

@property (nonatomic, assign) CGFloat startX;

@property (nonatomic, assign) CGFloat startY;

@end

@implementation YLDropDownMenuView

- (UIView *)containerView
{
    if (!_containerView) {
        UIView *containerView = [[UIView alloc] init];
        containerView.userInteractionEnabled = YES;
        containerView.backgroundColor = [UIColor grayColor];
        containerView.layer.cornerRadius = 4;
        containerView.clipsToBounds = YES;
        [self addSubview:containerView];
        self.containerView = containerView;
    }
    return _containerView;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

+ (instancetype)menu {
    return [[self alloc] init];
}

- (void)setContent:(UIView *)content {
    _content = content;
    [self.content addSubview:self.triang];
    content.y = 0;
    self.containerView.height = CGRectGetMaxY(content.frame);
    self.containerView.width = CGRectGetMaxX(content.frame);
    [self.containerView addSubview:content];
}

- (void)setContentController:(UIViewController *)contentController {
    _contentController = contentController;
    self.content = contentController.view;
}

- (void)showFrom:(UIView *)from
{
    UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
    [window addSubview:self];
    
    self.frame = window.bounds;
    CGRect newFrame = [from convertRect:from.bounds toView:window];
    
    
    _startX = CGRectGetMaxX(newFrame);
    _startY = CGRectGetMaxY(newFrame);
    
    self.triang = [[TriangleView alloc]init];
    
    self.triang.backgroundColor = [UIColor clearColor];
    [window addSubview:_triang];
    _triang.x =_startX-20;
    
    _triang.y = _startY-7.5;
    _triang.width =20;
    _triang.height=20;
    
    self.containerView.x = 0;
    self.containerView.y = 0;
    self.containerView.width = 0;
    self.containerView.height = 0;
    
    POPSpringAnimation *changeFrame = [POPSpringAnimation animation];
    changeFrame.property = [POPAnimatableProperty propertyWithName: kPOPViewFrame];
    changeFrame.fromValue = [NSValue valueWithCGRect:CGRectMake(_startX, _startY,0,0)];
    changeFrame.toValue = [NSValue valueWithCGRect:CGRectMake(_startX, _startY,-100 ,100)];
    changeFrame.springBounciness = 10;
    [self.containerView pop_addAnimation:changeFrame forKey:@"changeFrame"];
    if ([self.delegate respondsToSelector:@selector(dropdownMenuDidShow:)]) {
        [self.delegate dropdownMenuDidShow:self];
    }
    
}

- (void)dismiss {
    POPSpringAnimation *changeFrame = [POPSpringAnimation animation];
    changeFrame.property = [POPAnimatableProperty propertyWithName: kPOPViewFrame];
    changeFrame.fromValue = [NSValue valueWithCGRect:CGRectMake(_startX, _startY,-100,100)];
    changeFrame.toValue = [NSValue valueWithCGRect:CGRectMake(_startX, _startY,0 ,0)];
    [self.containerView pop_addAnimation:changeFrame forKey:@"changeFrame"];
    POPBasicAnimation *changAlpha = [POPBasicAnimation animation];
    changAlpha.property = [POPAnimatableProperty propertyWithName: kPOPViewAlpha];
    changAlpha.fromValue = @(1);
    changAlpha.toValue = @(0.0);
    [self.containerView pop_addAnimation:changAlpha forKey:@"changAlpha"];
    [self.triang pop_addAnimation:changAlpha forKey:@"changAlpha"];
    [changAlpha setCompletionBlock:^(POPAnimation *anim, BOOL finished) {
        [self removeFromSuperview];
    }];
}


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self dismiss];
}
@end



@implementation TriangleView

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    UIBezierPath *path = [UIBezierPath bezierPath];
    CGPoint startP = CGPointMake(0, 7.5);
    [path moveToPoint:startP];
    [path addLineToPoint:CGPointMake(7.5, 0)];
    [path addLineToPoint:CGPointMake(15, 7.5)];
    [path closePath];
    CGContextAddPath(ctx, path.CGPath);
    [[UIColor blackColor ] setFill];
    CGContextFillPath(ctx);
}

@end



你可能感兴趣的:(模仿淘宝下拉菜单)