我使用DrawRect進行的View的展開(是這樣描述的吧??), 效果圖也實現了類似於微信的View效果, 你可以看一看.
建立繼承於UIView的視圖 .h檔案
// backGoundView@property (nonatomic, strong) UIView * _Nonnull backGoundView;// titles@property (nonatomic, strong) NSArray * _Nonnull dataArray;// images@property (nonatomic, strong) NSArray * _Nonnull images;// height@property (nonatomic, assign) CGFloat row_height;// font@property (nonatomic, assign) CGFloat fontSize;// textColor@property (nonatomic, assign) UIColor * _Nonnull titleTextColor;// delegate@property (nonatomic, assign) id <selectIndexPathDelegate> _Nonnull delegate;// 初始化方法- (instancetype _Nonnull)initWithOrigin:(CGPoint) originWidth:(CGFloat) widthHeight:(CGFloat) heightType:(XTDirectionType)typeColor:( UIColor * _Nonnull ) color;- (void)popView;- (void)dismiss;
##.m 實現部分
定義用到的宏
#define ScreenWidth [UIScreen mainScreen].bounds.size.width#define ScreenHeight [UIScreen mainScreen].bounds.size.height#define Length 5#define Length2 15
@property (nonatomic, assign) CGPoint origin; // 箭頭位置@property (nonatomic, assign) CGFloat height; // 視圖的高度@property (nonatomic, assign) CGFloat width; // 視圖的寬度@property (nonatomic, assign) XTDirectionType type; // 箭頭位置類型@property (nonatomic, strong) UITableView *tableView; // 填充的tableview
自訂初始化方法
- (instancetype)initWithOrigin:(CGPoint)origin Width:(CGFloat)width Height:(CGFloat)height Type:(XTDirectionType)type Color:(UIColor *)color{self = [super initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];if (self) {self.backgroundColor = [UIColor clearColor];self.origin = origin;self.width = width;self.height = height;self.type = type;self.backGoundView = [[UIView alloc] initWithFrame:CGRectMake(origin.x, origin.y, width, height)];self.backGoundView.backgroundColor = color;[self addSubview:self.backGoundView];[self.backGoundView addSubview:self.tableView];}return self;}
drawRect
#pragma mark - drawRect- (void)drawRect:(CGRect)rect {// Drawing codeCGContextRef context = UIGraphicsGetCurrentContext();switch (self.type) {case XTTypeOfUpLeft:case XTTypeOfUpCenter:case XTTypeOfUpRight:{{CGFloat startX = self.origin.x;CGFloat startY = self.origin.y;CGContextMoveToPoint(context, startX, startY);CGContextAddLineToPoint(context, startX + Length, startY + Length);CGContextAddLineToPoint(context, startX - Length, startY + Length);}break;}case XTTypeOfDownLeft:case XTTypeOfDownCenter:case XTTypeOfDownRight: {{CGFloat startX = self.origin.x;CGFloat startY = self.origin.y;CGContextMoveToPoint(context, startX, startY);CGContextAddLineToPoint(context, startX - Length, startY - Length);CGContextAddLineToPoint(context, startX + Length, startY - Length);}break;}case XTTypeOfLeftUp:case XTTypeOfLeftCenter:case XTTypeOfLeftDown: {{CGFloat startX = self.origin.x;CGFloat startY = self.origin.y;CGContextMoveToPoint(context, startX, startY);CGContextAddLineToPoint(context, startX + Length, startY - Length);CGContextAddLineToPoint(context, startX + Length, startY + Length);}break;}case XTTypeOfRightUp:case XTTypeOfRightCenter:case XTTypeOfRightDown: {{CGFloat startX = self.origin.x;CGFloat startY = self.origin.y;CGContextMoveToPoint(context, startX, startY);CGContextAddLineToPoint(context, startX - Length, startY - Length);CGContextAddLineToPoint(context, startX - Length, startY + Length);}break;}}CGContextClosePath(context);[self.backGoundView.backgroundColor setFill];[self.backgroundColor setStroke];CGContextDrawPath(context, kCGPathFillStroke);}
彈出視圖
#pragma mark - popView- (void)popView{// 同步顯示 子控制項(views)和(self)NSArray *results = [self.backGoundView subviews];for (UIView *view in results) {[view setHidden:YES];}UIWindow *windowView = [UIApplication sharedApplication].keyWindow;[windowView addSubview:self];switch (self.type) {case XTTypeOfUpLeft: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y + Length, 0, 0);CGFloat origin_x = self.origin.x - Length2;CGFloat origin_y = self.origin.y + Length;CGFloat size_width = self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfUpCenter: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y + Length, 0, 0);CGFloat origin_x = self.origin.x - self.width / 2;CGFloat origin_y = self.origin.y + Length;CGFloat size_width = self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfUpRight: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y + Length, 0, 0);CGFloat origin_x = self.origin.x + Length2;CGFloat origin_y = self.origin.y + Length;CGFloat size_width = -self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfDownLeft: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y - Length, 0, 0);CGFloat origin_x = self.origin.x - Length2;CGFloat origin_y = self.origin.y - Length;CGFloat size_width = self.width;CGFloat size_height = -self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfDownCenter: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y - Length, 0, 0);CGFloat origin_x = self.origin.x - self.width / 2;CGFloat origin_y = self.origin.y - Length;CGFloat size_width = self.width;CGFloat size_height = -self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfDownRight: {{self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y - Length, 0, 0);CGFloat origin_x = self.origin.x-self.width + Length2;CGFloat origin_y = self.origin.y - Length;CGFloat size_width = self.width;CGFloat size_height = -self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfLeftUp: {{self.backGoundView.frame = CGRectMake(self.origin.x + Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x + Length;CGFloat origin_y = self.origin.y - Length2;CGFloat size_width = self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfLeftCenter: {{self.backGoundView.frame = CGRectMake(self.origin.x + Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x + Length;CGFloat origin_y = self.origin.y - self.height / 2;CGFloat size_width = self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfLeftDown: {{self.backGoundView.frame = CGRectMake(self.origin.x + Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x + Length;CGFloat origin_y = self.origin.y - self.height + Length2;CGFloat size_width = self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfRightUp: {{self.backGoundView.frame = CGRectMake(self.origin.x - Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x - Length;CGFloat origin_y = self.origin.y - Length2;CGFloat size_width = -self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfRightCenter: {{self.backGoundView.frame = CGRectMake(self.origin.x - Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x - Length;CGFloat origin_y = self.origin.y - self.height / 2;CGFloat size_width = -self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}case XTTypeOfRightDown: {{self.backGoundView.frame = CGRectMake(self.origin.x - Length, self.origin.y, 0, 0);CGFloat origin_x = self.origin.x - Length;CGFloat origin_y = self.origin.y - self.height + Length2;CGFloat size_width = -self.width;CGFloat size_height = self.height;[self startAnimateView_x:origin_x _y:origin_y origin_width:size_width origin_height:size_height];}break;}}}
#pragma mark -
- (void)startAnimateView_x:(CGFloat) x_y:(CGFloat) yorigin_width:(CGFloat) widthorigin_height:(CGFloat) height{[UIView animateWithDuration:0.25 animations:^{self.backGoundView.frame = CGRectMake(x, y, width, height);}completion:^(BOOL finished) {NSArray *results = [self.backGoundView subviews];for (UIView *view in results) {[view setHidden:NO];}}];}
點擊空白處回收
#pragma mark -- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{if (![[touches anyObject].view isEqual:self.backGoundView]) {[self dismiss];} }
#pragma mark -- (void)dismiss{/*** 刪除 在backGroundView 上的子控制項*/NSArray *results = [self.backGoundView subviews];for (UIView *view in results) {[view removeFromSuperview]; }[UIView animateWithDuration:0.25 animations:^{//self.backGoundView.frame = CGRectMake(self.origin.x, self.origin.y, 0, 0);} completion:^(BOOL finished) {//[self removeFromSuperview];}];}
內部的tableview
#pragma mark -- (UITableView *)tableView{if (!_tableView) {_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.backGoundView.frame.size.width - 5, self.backGoundView.frame.size.height) style:UITableViewStylePlain];_tableView.dataSource = self;_tableView.backgroundColor = [UIColor clearColor];_tableView.delegate = self;}return _tableView;}#pragma mark -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.dataArray.count;}#pragma mark -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{if (self.row_height == 0) {return 44;}else{return self.row_height;}}#pragma mark -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *cellIdentifier = @"cellIdentifier2";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];}cell.backgroundColor = [UIColor clearColor];cell.imageView.image = [UIImage imageNamed:self.images[indexPath.row]];cell.textLabel.text = self.dataArray[indexPath.row];cell.textLabel.font = [UIFont systemFontOfSize:self.fontSize];cell.textLabel.textColor = self.titleTextColor;return cell;}// 想要實現點擊進行其他動作, 這裡用到了協議- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{if (self.delegate && [self.delegate respondsToSelector:@selector(selectIndexPathRow:)]) {[self.delegate selectIndexPathRow:indexPath.row];}}
##在.h檔案還要聲明一份協議
@protocol selectIndexPathDelegate <NSObject>- (void)selectIndexPathRow:(NSInteger )index;@end
使用
@interface ViewController ()<selectIndexPathDelegate>
##你可以在btn的點擊方法裡這樣寫
// 支援多種類型/**XTTypeOfUpLeft, // 上左XTTypeOfUpCenter, // 上中XTTypeOfUpRight, // 上右XTTypeOfDownLeft, // 下左XTTypeOfDownCenter, // 下中XTTypeOfDownRight, // 下右XTTypeOfLeftUp, // 左上XTTypeOfLeftCenter, // 左中XTTypeOfLeftDown, // 左下XTTypeOfRightUp, // 右上XTTypeOfRightCenter,// 右中XTTypeOfRightDown, // 右下*/CGPoint point = CGPointMake(_customBtn.center.x,_customBtn.frame.origin.y + 64);XTPopView *view1 = [[XTPopView alloc] initWithOrigin:point Width:130 Height:40 * 4 Type:XTTypeOfUpRight Color:[UIColor colorWithRed:0.2737 green:0.2737 blue:0.2737 alpha:1.0]];view1.dataArray = @[@"發起群聊",@"添加朋友", @"掃一掃", @"收付款"];view1.images = @[@"發起群聊",@"添加朋友", @"掃一掃", @"付款"];view1.fontSize = 13;view1.row_height = 40;view1.titleTextColor = [UIColor whiteColor];view1.delegate = self;[view1 popView];
##想要使用點擊方法 只要實現協議的方法就可以了
- (void)selectIndexPathRow:(NSInteger)index{switch (index) {case 0:{NSLog(@"Click 0 ......");}break;case 1:{NSLog(@"Clikc 1 ......");}break;case 2:{NSLog(@"Clikc 2 ......");}break;case 3:{NSLog(@"Clikc 3 ......");}break;default:break;}}
總結
以上就是基於IOS實現帶箭頭的view的全部內容,希望對大家開發IOS能有所協助。