iOS重写drawRect方法实现带箭头的View

创建一个UIView的子类,重写drawRect方法可以实现不规则形状的View,这里提供一个带箭头View的实现代码:

ArrowView.h

#import <UIKit/UIKit.h>

@interface ArrowView : UIView

@end

ArrowView.m

#import "ArrowView.h"

@implementation ArrowView

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (instancetype)init{

    self = [super init];
    if (self) {
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;

}

- (instancetype)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor whiteColor];
    }
    return self;

}

- (void)drawRect:(CGRect)rect{
    [super drawRect:rect];

    NSLog(@"正在drawRect...");

    //获取当前图形,视图推入堆栈的图形,相当于你所要绘制图形的图纸
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //
    [[UIColor whiteColor] set];
    //创建一个新的空图形路径
    CGContextBeginPath(ctx);

    NSLog(@"开始绘制...");

    //起始位置坐标
    CGFloat origin_x = rect.origin.x;
    CGFloat origin_y = 10; //frame.origin.y + 10;
    //第一条线的位置坐标
    CGFloat line_1_x = rect.size.width - 20;
    CGFloat line_1_y = origin_y;
    //第二条线的位置坐标
    CGFloat line_2_x = line_1_x + 5;
    CGFloat line_2_y = rect.origin.y;
    //第三条线的位置坐标
    CGFloat line_3_x = line_2_x + 5;
    CGFloat line_3_y = line_1_y;
    //第四条线的位置坐标
    CGFloat line_4_x = rect.size.width;
    CGFloat line_4_y = line_1_y;
    //第五条线的位置坐标
    CGFloat line_5_x = rect.size.width;
    CGFloat line_5_y = rect.size.height;
    //第六条线的位置坐标
    CGFloat line_6_x = origin_x;
    CGFloat line_6_y = rect.size.height;

    CGContextMoveToPoint(ctx, origin_x, origin_y);

    CGContextAddLineToPoint(ctx, line_1_x, line_1_y);
    CGContextAddLineToPoint(ctx, line_2_x, line_2_y);
    CGContextAddLineToPoint(ctx, line_3_x, line_3_y);
    CGContextAddLineToPoint(ctx, line_4_x, line_4_y);
    CGContextAddLineToPoint(ctx, line_5_x, line_5_y);
    CGContextAddLineToPoint(ctx, line_6_x, line_6_y);

    CGContextClosePath(ctx);

    //设置填充颜色
    UIColor *customColor = [UIColor colorWithWhite:0 alpha:0.8];
    CGContextSetFillColorWithColor(ctx, customColor.CGColor);
    CGContextFillPath(ctx);
}

@end

然后在ViewController中调用,查看结果

ViewController.m

#import "ViewController.h"
#import "ArrowView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSLog(@"begin...");

    ArrowView *view = [[ArrowView alloc] initWithFrame:CGRectMake(100, 100, 200, 80)];
    //[view setBackgroundColor:[UIColor orangeColor]];
    [self.view addSubview:view];

    NSLog(@"end...");
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

结果截图:

控制台打印结果:

控制台打印的线程ID是相同的,说明drawRect的方法是在主线程调用的。

时间: 2024-10-19 04:18:20

iOS重写drawRect方法实现带箭头的View的相关文章

ios如果写一个提示带动画的View,可以来引导用户行为

先上图: 这个UIView可以这样写: -(id)initWithFrame:(CGRect)frame backImage:(UIImage*)image msgStr:(NSString*)txt txtColor:(UIColor*)color{ self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; _paopaoImage = image; _txt = t

ios 重写UIFont方法 自定义字体类型及大小

方法是重写了系统的systemFontOfSize 新建一个model类     选择高亮状态下得文件  点击Next 下一步    因为我重写的UIFont方法   所以继承UIFont     File那一框填写文件名字 下面我就直接贴出我的model类    .h .m 很简单    这样写完之后  下面是调用方法   有白线的   就是重写的方法   大家写完之后可以点进去看看 有什么不懂的   大家可以加群472373458   我会为大家解答   尽我所能把   大家一起学习,成长

IOS重写description方法,自定义控制台(log)信息

description是所有类都有的一个方法. 我们重写这个方法,可以自定义实例输出的信息. 比如我们创建一个Person类: 在.h文件中添加两个属性: #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; @property (assign, nonatomic) int age; @end 在.m文件中重写descriptio

ios假设写一个提示带动画的View,能够来引导用户行为

先上图: 这个UIView能够这样写: -(id)initWithFrame:(CGRect)frame backImage:(UIImage*)image msgStr:(NSString*)txt txtColor:(UIColor*)color{ self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; _paopaoImage = image; _txt = t

自定义View 一 (继承VIew重写onDraw方法)

项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int COLOR = Color.RED; private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private int mWidth = 0; private int mHeight = 0; public CircleView(Contex

IOS开发中重写init方法使用需谨慎

IOS开发中重写init方法使用需谨慎 今天在写一个小软件的时候出现一点问题,这个软件的功能是搜索全国学校,首页就是搜索输入框,在框中输入完要查询的学校所在省份,点击buttom后就会跳转到对应的视图控制器中,然后把搜索结果呈现在一个TableView上,但是我在调试时,每次输入完然后点击搜索按钮时,弹出结果列表总是空的,我需要返回到首页再点击一次搜索才会出现结果,而且我在首页更改搜索关键字之后,点击搜索,结果还是上次的搜索结果,必须返回点击一次才会出现这次的搜索结果. 经过大神指点,原来这个问

Asp.Net实现JS前台带箭头的流程图方法总结!(个人笔记,信息不全)

Asp.Net实现JS前台带箭头的流程图方法总结!(持续更新中) 一.返回前台json格式 json5 = "[{\"Id\":2259,\"Name\":\"高中\"},{\"Id\":2259,\"tName\":\"初中\"},{"Id":2259,"Name":"小学"}]"; Asp.Net实现JS

iOS的layoutSubviews和drawRect方法何时调用

layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews.2.addSubview会触发layoutSubviews.3.设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化.4.滚动一个UIScrollView会触发layoutSubviews.5.旋转Screen会触发父UIView上的layoutSubviews事件.6.改变一个UIView大小的时候也会触发父UIView上的layoutS

iOS 自定义控件--重写一些方法

学习源码是提升自己的一个很好的方法,在我们封装自己的控件的时候,可以重写一些方法.并且重写了当加载页面的时候会自动走这些方法.如 UIbutton中的几个方法 - (CGRect)backgroundRectForBounds:(CGRect)bounds; - (CGRect)contentRectForBounds:(CGRect)bounds; - (CGRect)titleRectForContentRect:(CGRect)contentRect; - (CGRect)imageRec