效果图:

iOS 自定义绘制气泡

代码如下:

#import "PopView.h"

#define kPopupTriangleHeigh 5

#define kPopupTriangleWidth 6

#define kPopupTriangleTopPointX 3 * (self.frame.size.width - kPopupTriangleWidth)/ 20.0f

#define kBorderOffset       0//0.5f

@implementation PopView


- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        self.backgroundColor = [UIColor clearColor];

        [self initUI];

    }

    return self;

}

- (void)initUI

{

    _label = [[UILabel alloc] init];

    _label.textColor = [UIColor colorFromHex:0x666666];

    _label.font = [UIFont systemFontOfSize:11];

    _label.numberOfLines = 0;

    _label.text = @"地址作为评估贷款额度的重要依据,需精确到门牌号\n请按如下格式填写:\n小区类:XX路XX号XX小区XX栋XX室\n农村类:XX县XX镇XX村XX组\n大厦类:XX路XX号XX大厦XX层XX室";

    [self addSubview:_label];

    [_label mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(self.mas_left).mas_equalTo(10);

        make.centerX.mas_equalTo(self.mas_centerX);

        make.top.mas_equalTo(self.mas_top).mas_equalTo(20);

    }];

}

-(void)drawRect:(CGRect)rect{

    [super drawRect:rect];

    

    CGFloat viewW = rect.size.width;

    CGFloat viewH = rect.size.height;

    

    CGFloat strokeWidth = 0.2;

    CGFloat borderRadius = 5;

    CGFloat offset = strokeWidth + kBorderOffset;

    

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineJoin(context, kCGLineJoinRound); //

    CGContextSetLineWidth(context, strokeWidth); // 设置画笔宽度

    CGContextSetStrokeColorWithColor(context, [UIColor colorFromHex:0x3082f2].CGColor); // 设置画笔颜色

    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); // 设置填充颜色

    

    CGContextBeginPath(context);

    CGContextMoveToPoint(context, borderRadius+offset, kPopupTriangleHeigh + offset);

    CGContextAddLineToPoint(context, kPopupTriangleTopPointX - kPopupTriangleWidth / 2.0 + offset, kPopupTriangleHeigh + offset);

    CGContextAddLineToPoint(context, kPopupTriangleTopPointX, offset);

    CGContextAddLineToPoint(context, kPopupTriangleTopPointX + kPopupTriangleWidth / 2.0 +offset, kPopupTriangleHeigh+offset);

    

    CGContextAddArcToPoint(context, viewW-offset, kPopupTriangleHeigh+offset, viewW-offset, kPopupTriangleHeigh+offset + borderRadius, borderRadius-strokeWidth);

    CGContextAddArcToPoint(context, viewW-offset, viewH - offset, viewW-borderRadius-offset, viewH - offset, borderRadius-strokeWidth);

    CGContextAddArcToPoint(context, offset, viewH - offset, offset, viewH - borderRadius - offset, borderRadius-strokeWidth);

    CGContextAddArcToPoint(context, offset, kPopupTriangleHeigh + offset, viewW - borderRadius - offset, kPopupTriangleHeigh + offset, borderRadius-strokeWidth);

    CGContextClosePath(context);

    CGContextDrawPath(context, kCGPathFillStroke);

}

- (void)dismiss

{

    __weak __typeof(self) weakSelf = self;

    [UIView animateWithDuration:0.2 animations:^{

        weakSelf.alpha = 0;

        weakSelf.frame = CGRectMake(weakSelf.frame.origin.x + kPopupTriangleTopPointX , weakSelf.frame.origin.y, 0, 0);

    } completion:^(BOOL finished) {

        [_label removeFromSuperview];

        [weakSelf removeFromSuperview];

        

    }];

}


@end




相关文章: