你好,歡迎來到IOS教程網

 Ios教程網 >> IOS教程 >> 關於IOS教程 >> 基於IOS實現帶箭頭的view

基於IOS實現帶箭頭的view

編輯:關於IOS教程

我使用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);
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];
}
}];
}

點擊空白處回收

#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能有所幫助。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved