基於IOS實現帶箭頭的view_IOS

來源:互聯網
上載者:User

我使用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能有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.