基于IOS實(shí)現(xiàn)帶箭頭的view
我使用DrawRect進(jìn)行的View的拉伸(是這樣描述的吧??), 效果圖也實(shí)現(xiàn)了類(lèi)似于微信的View效果, 你可以看一看.

創(chuàng)建繼承于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 實(shí)現(xiàn)部分
定義用到的宏
#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; // 箭頭位置類(lèi)型 @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);
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) 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];
}
}];
}
點(diǎn)擊空白處回收
#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];
}];
}
內(nèi)部的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;
}
// 想要實(shí)現(xiàn)點(diǎn)擊進(jìn)行其他操作, 這里用到了協(xié)議
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.delegate && [self.delegate respondsToSelector:@selector(selectIndexPathRow:)]) {
[self.delegate selectIndexPathRow:indexPath.row];
}
}
##在.h文件還要聲明一份協(xié)議
@protocol selectIndexPathDelegate <NSObject> - (void)selectIndexPathRow:(NSInteger )index; @end
使用
@interface ViewController ()<selectIndexPathDelegate>
##你可以在btn的點(diǎn)擊方法里這樣寫(xiě)
// 支持多種類(lèi)型 /** 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 = @[@"發(fā)起群聊",@"添加朋友", @"掃一掃", @"收付款"]; view1.images = @[@"發(fā)起群聊",@"添加朋友", @"掃一掃", @"付款"]; view1.fontSize = 13; view1.row_height = 40; view1.titleTextColor = [UIColor whiteColor]; view1.delegate = self; [view1 popView];
##想要使用點(diǎn)擊方法 只要實(shí)現(xiàn)協(xié)議的方法就可以了
- (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;
}
}
總結(jié)
以上就是基于IOS實(shí)現(xiàn)帶箭頭的view的全部?jī)?nèi)容,希望對(duì)大家開(kāi)發(fā)IOS能有所幫助。
相關(guān)文章
IOS實(shí)現(xiàn)簽到特效(散花效果)的實(shí)例代碼
這篇文章主要介紹了IOS實(shí)現(xiàn)簽到特效(散花效果)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
iOS中無(wú)限循環(huán)滾動(dòng)簡(jiǎn)單處理實(shí)現(xiàn)原理分析
這篇文章主要介紹了iOS中無(wú)限循環(huán)滾動(dòng)簡(jiǎn)單處理實(shí)現(xiàn)原理分析,需要的朋友可以參考下2017-12-12
iOS9中的WebKit 與 Safari帶來(lái)的驚喜
這篇文章主要介紹了iOS9中的WebKit 與 Safari帶來(lái)的驚喜的相關(guān)資料,需要的朋友可以參考下2015-11-11
iOS中應(yīng)用內(nèi)添加指紋識(shí)別的實(shí)例代碼
iOS8之后蘋(píng)果發(fā)布了指紋識(shí)別的功能,通過(guò)touch ID來(lái)識(shí)別用戶,做用戶授權(quán),主要是依賴于LocalAuthentication庫(kù),下面通過(guò)本文給大家介紹iOS中應(yīng)用內(nèi)添加指紋識(shí)別的實(shí)例代碼,一起看看吧2016-12-12
safari調(diào)試iOS app web頁(yè)面的步驟
這篇文章主要為大家詳細(xì)介紹了safari調(diào)試iOS app web頁(yè)面的步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
iOS實(shí)現(xiàn)日歷翻頁(yè)動(dòng)畫(huà)
本文的內(nèi)容主要是在IOS中實(shí)現(xiàn)日歷翻頁(yè)的動(dòng)畫(huà),界面簡(jiǎn)單但效果很好,以后可以運(yùn)用到app中,下面一起來(lái)看看。2016-08-08
僅需幾行代碼實(shí)現(xiàn)方便易用的狀態(tài)欄指示器
本文通過(guò)僅僅數(shù)行代碼實(shí)現(xiàn)了非常方便易用的狀態(tài)欄指示器,比如微博項(xiàng)目的微博數(shù)提醒框,需要的朋友可以參考下2015-08-08
iOS創(chuàng)建對(duì)象的不同姿勢(shì)詳解
這篇文章主要介紹了iOS創(chuàng)建對(duì)象的不同姿勢(shì),文中介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-02-02

