我應用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) origin Width:(CGFloat) width Height:(CGFloat) height Type:(XTDirectionType)type Color:( 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 code CGContextRef 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); CGContextAddL.netoPoint(context, startX + Length, startY + Length); CGContextAddL.netoPoint(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) y origin_width:(CGFloat) width origin_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能有所贊助。
【基於IOS完成帶箭頭的view】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!