类似于微信首页右上角弹出view

闲来无事,试着写写我的第一篇博客,只为了以后自己找着方便偷笑本人是一个菜鸟级程序猿,没有高级的代码片段,全是基础代码

首先创建一个继承于UIView的类,自行取名,此处我取名为RightView

RightView.h中:

#import <UIKit/UIKit.h>

@class RightView;
@protocol RightViewDelegate <NSObject>
//view 的代理,点击view上某一行执行的动作
- (void)rightView:(RightView *)rightView didSelectedIndex:(NSInteger)index;
@end

typedef void(^dismissCompletion)(void);//定义一个block,用于执行view消失后的操作

@interface RightView : UIView<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic, assign) id<RightViewDelegate>delegate;

@property (nonatomic, assign) BOOL isShow;//用来记录view是否是展示状态



- (instancetype)initWithTitleArray:(NSArray *)titleArray imageArray:(NSArray *)imageArray origin:(CGPoint)rightViewPoint  width:(CGFloat)width triangleOrigin:(CGPoint)triangleOrigin;//titleArray:文本信息数据源数组    imageArray:图片数据源数组  rightViewPoint:本身起点坐标  width:本身宽度   triangleOrigin:所属三角起点坐标
- (void)showInView:(UIView *)aView;//展示view
- (void)dismissFromSuperView:(dismissCompletion)completion;//view消失 移除

@end

RightView.m中:

#import "RightView.h"

#define triangleHeight  6

@implementation RightView{
    
    UITableView             *table;
    CGPoint                 rightViewOriginalOrigin;//定义一个point记录view原始位置
    CGFloat                 rightViewOriginalWidth;//定义一个值记录view原始宽度
    CGFloat                 triangleOriginX;//定义一个值记录三角起始坐标的x坐标
    CGRect                  rightViewOriginalFrame;
    NSArray                 *titlesArray;
    NSArray                 *imagesArray;
}

- (instancetype)initWithTitleArray:(NSArray *)titleArray imageArray:(NSArray *)imageArray origin:(CGPoint)rightViewPoint  width:(CGFloat)width triangleOrigin:(CGPoint)triangleOrigin{
    self = [super init];
    if (self) {
        
        titlesArray = titleArray;
        imagesArray = imageArray;
        
        CGRect selfFrame = self.frame;
        selfFrame.origin.x = rightViewPoint.x;
        selfFrame.origin.y = rightViewPoint.y;
        selfFrame.size.width = width;
        selfFrame.size.height = 40*titleArray.count + triangleHeight;
        self.frame = selfFrame;
        
        rightViewOriginalOrigin = rightViewPoint;
        rightViewOriginalWidth = width;
        rightViewOriginalFrame = selfFrame;
        triangleOriginX = triangleOrigin.x;
        
        [self createTableView];
    }
    
    return self;
}

- (void)createTableView{
    
    table = [[UITableView alloc] initWithFrame:CGRectMake(0, triangleHeight, self.frame.size.width, self.frame.size.height - triangleHeight) style:UITableViewStylePlain];
    table.delegate = self;
    table.dataSource = self;
    table.layer.cornerRadius = 5.0f;
    table.scrollEnabled = NO;
    [self addSubview:table];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    return titlesArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *cellIdentifier = @"rightViewCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
        
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    
    //    取值
    NSString *titleStr = [titlesArray objectAtIndex:indexPath.row];
    NSString *imageNameStr = [imagesArray objectAtIndex:indexPath.row];
    
    //在cell上创建一个imageView显示图片
    UIImageView *cellImage = [[UIImageView alloc] initWithFrame:CGRectMake(10, 7.5, 25, 25)];
    [cell.contentView addSubview:cellImage];
    
    //在cell上创建一个label显示文字信息
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 10, tableView.frame.size.width - 55, 20)];
    titleLabel.font = [UIFont systemFontOfSize:14];
    [cell.contentView addSubview:titleLabel];
    
    if (imageNameStr != nil && ![imageNameStr isEqualToString:@""]) {
        cellImage.hidden = NO;
        titleLabel.frame = CGRectMake(40, 10, tableView.frame.size.width - 55, 20);
    }
    else{
        cellImage.hidden = YES;
        titleLabel.frame = CGRectMake(10, 10, tableView.frame.size.width - 15, 20);
    }
    
    //在cell上创建一个label用作分割线
    UILabel *lineLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, rightViewOriginalWidth - 15, 0.5)];
    lineLabel.backgroundColor = [UIColor grayColor];
    [cell.contentView addSubview:lineLabel];
    
    
    
    cellImage.image = [UIImage imageNamed:imageNameStr];
    titleLabel.text = titleStr;
    
    return cell;
}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return 40;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (_delegate && [_delegate respondsToSelector:@selector(rightView:didSelectedIndex:)]) {
        [_delegate rightView:self didSelectedIndex:indexPath.row];
    }
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    [self dismissFromSuperView:nil];
}

- (void)showInView:(UIView *)aView{
    self.frame = CGRectMake(rightViewOriginalOrigin.x, rightViewOriginalOrigin.y, rightViewOriginalWidth, 40*titlesArray.count);
    self.alpha = 1;
    self.isShow = YES;
    [aView addSubview:self];
}

- (void)dismissFromSuperView:(dismissCompletion)completion{
    
    __weak __typeof(self) weakSelf = self;
    
    [UIView animateWithDuration:0.2 animations:^{

//        CGRect frame = rightViewOriginalFrame;
//        frame.origin.x += 10;
//        frame.size.width -= 10;
//        frame.size.height -= 20;
//        weakSelf.frame = frame;
        weakSelf.frame = CGRectMake(rightViewOriginalOrigin.x + rightViewOriginalWidth, rightViewOriginalOrigin.y, 0, 0);
        weakSelf.alpha = 0;
        
    }completion:^(BOOL finished) {
        
        [weakSelf removeFromSuperview];
        weakSelf.isShow = NO;
        if (completion) {
            completion();
        }
    }];
    
}

- (void)drawRect:(CGRect)rect{
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    //画一个三角形
    CGPoint sPoints[3];//坐标点
    sPoints[0] = CGPointMake(triangleOriginX, triangleHeight); //左下角坐标
    sPoints[1] = CGPointMake(triangleOriginX + 5, 0); //上边坐标
    sPoints[2] = CGPointMake(triangleOriginX + 10, triangleHeight);//右下角坐标
    CGContextAddLines(context, sPoints, 3);//添加线
    CGContextClosePath(context);//封起来
    CGContextSetRGBFillColor(context, 255/255.0, 255/255.0, 255/255.0, 1);//内容填充颜色
    CGContextSetRGBStrokeColor(context, 255/255.0, 255/255.0, 255/255.0, 1);//路径填充颜色
    CGContextDrawPath(context, kCGPathFillStroke);//根据坐标绘制路径
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    [self dismissFromSuperView:nil];
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end
好,这就是我封装的view 的代码


以下是用法

比如是在ViewController中引用此view,需先导入头文件

#import "RightView.h",并且遵循

RightViewDelegate协议,

在ViewController.m中:

UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showRightView)];
    self.navigationItem.rightBarButtonItem = rightBarButtonItem;
    
    rightView = [[RightView alloc] initWithTitleArray:@[@"你好",@"呀呼嗨", @"no"] imageArray:@[@"[10]",@"[11]", @"[12]"] origin:CGPointMake(self.view.frame.size.width - 110, 10 + 64) width:100 triangleOrigin:CGPointMake(75, 0)];

- (void)showRightView{

    if (rightView.isShow) {
        [rightView dismissFromSuperView:nil];
    }
    else{
        rightView.delegate = self;
        [rightView showInView:self.view];
    }
    
}


 实现代理方法: 
#define RightViewDelegate
- (void)rightView:(RightView *)rightView didSelectedIndex:(NSInteger)index{
    
    NSLog(@"你点击了第%ld行",index);
}

实现的效果就如下图



话不多说,只为自己能看,不为其他微笑


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值