代码实现引导页遮罩(2)

新建HJHoledView类,代码如下:

/*

绘制遮罩可以画(圆形,矩形,圆角矩形,自定义视图)

添加箭头和提示文字

案例:

//添加遮罩指示

self.holedView = [[HJHoledView alloc]initWithFrame:self.view.frame];

[self.holedView setDimingColor: [[UIColor redColor] colorWithAlphaComponent:0.75f]];

//self.holedView.holeViewDelegate = self;

[self.view addSubview:_holedView];

//按钮-圆角矩形

[self.holedView addHoleRoundedRectOnRect:_myButton.frame withCornerRadius:_myButton.frame.size.width/2];

[self.holedView addFocusView:_myButton];

//圆形

[self.holedView addHoleCircleCenteredOnPosition:CGPointMake(190, 110) andDiameter:130];

[self.holedView addHoleCircleCenteredOnPosition:CGPointMake(190, 310) andDiameter:130];

//文字说明

//[self.holedView addHCustomView:[self viewForDemo] onRect:CGRectMake(20.0f, 250.0f, 200.0f, 50.0f)];

[self.holedView addPromptLabelText:@"哈哈哈哈哈哈哈哈" onRect:CGRectMake(20.0f, 150.0f, 200.0f, 50.0f)];

[self.holedView addPromptLabelText:@"嘻嘻嘻嘻嘻嘻嘻" onRect:CGRectMake(20.0f, 200.0f, 200.0f, 50.0f)];

//添加箭头

[self.holedView addArrowView:CGPointMake(100, 150) endPoint:CGPointMake(150, 100)];

[self.holedView addArrowView:CGPointMake(100, 250) endPoint:CGPointMake(150, 300)];

2016年3月1号jing

*/

#import

#import"RTLabel.h"

typedefNS_ENUM(NSInteger, HJHoleType)

{

HJHoleTypeCirle,

HJHoleTypeRect,

HJHoleTypeRoundedRect,

HJHoleTypeCustomRect

};

@classHJHoledView;

@protocolHJHoledViewDelegate

@optional

-(void)animationViewRemove:(HJHoledView*)_animationView;

-(void)animationDidOver:(HJHoledView*)_animationView;

-(void)exitButtonAction:(HJHoledView*)_animationView;

@end

@interfaceHJHoledView :UIView{

__weakid_delegate;

}

@property(weak)id delegate;

@property(strong,nonatomic)UIColor*dimingColor;//颜色默认黑色半透明

- (NSInteger)addHoleCircleCenteredOnPosition:(CGPoint)centerPoint andDiameter:(CGFloat)diamter;

- (NSInteger)addHoleRectOnRect:(CGRect)rect;

- (NSInteger)addHoleRoundedRectOnRect:(CGRect)rect withCornerRadius:(CGFloat)cornerRadius;

- (NSInteger)addHCustomView:(UIView*)customView onRect:(CGRect)rect;//自定义视图

- (UILabel*)addPromptLabelText:(NSString*)_textStr onRect:(CGRect)rect;//提示文字返回UILabel方便修改字体大小颜色等

-(void)addArrowView:(CGPoint)_startP endPoint:(CGPoint)_endP;//添加箭头

-(void)addImgArrowView:(CGPoint)_point rotation:(UIImageOrientation)_orientation;//添加图片箭头

- (void)addFocusView:(UIView*)focus;//添加聚焦按钮之类的

- (void)removeHoles:(BOOL)_isAnimation;

-(void)addExitBtn;//默认位置右上角

-(void)addExitBtn:(CGRect)rect;

@end

//

//HJHoledView.h

//HoledViewTest

//

//Created by hsmob on 16/2/29.

//Copyright © 2016年WeiMob. All rights reserved.

//

#import"HJHoledView.h"

#import"HJArrowView.h"

#pragma mark - holes objects

@interfaceHJHole :NSObject

@property(assign)HJHoleTypeholeType;

@end

@implementationHJHole

@end

@interfaceHJCircleHole :HJHole

@property(assign)CGPointholeCenterPoint;

@property(assign)CGFloatholeDiameter;

@end

@implementationHJCircleHole

@end

@interfaceHJRectHole :HJHole

@property(assign)CGRectholeRect;

@end

@implementationHJRectHole

@end

@interfaceHJRoundedRectHole :HJRectHole

@property(assign)CGFloatholeCornerRadius;

@end

@implementationHJRoundedRectHole

@end

@interfaceHJCustomRectHole :HJRectHole

@property(strong)UIView*customView;

@end

@implementationHJCustomRectHole

@end

@interfaceHJHoledView()

@property(strong,nonatomic)NSMutableArray*holes;//高亮区域数组

@property(strong,nonatomic)NSMutableArray*focusView;//点击区域数组

@end

@implementationHJHoledView

#pragma mark - LifeCycle

- (void)awakeFromNib

{

[superawakeFromNib];

[selfsetup];

}

- (instancetype)initWithCoder:(NSCoder*)aDecoder

{

self= [superinitWithCoder:aDecoder];

if(self) {

[selfsetup];

}

returnself;

}

- (instancetype)initWithFrame:(CGRect)frame

{

self= [superinitWithFrame:frame];

if(self) {

[selfsetup];

[selfshowAnimation];

}

returnself;

}

- (void)setup

{

_holes= [NSMutableArraynew];

_focusView= [NSMutableArraynew];

self.backgroundColor= [UIColorclearColor];

_dimingColor= [[UIColorblackColor]colorWithAlphaComponent:0.75f];

}

-(void)addExitBtn{

floatwidth=40;

floatx=ScreenWidth-width-20;

floaty=20;

CGRectrect=CGRectMake(x,y, width,35);

[selfaddExitBtn:rect];

}

-(void)addExitBtn:(CGRect)rect{

UIButton*exitButton=[[UIButtonalloc]initWithFrame:rect];

[exitButtonsetBackgroundColor:[UIColorcolorWithRed:0.011green:0.000blue:0.000alpha:.000]];

[exitButtonsetTitle:@"退出"forState:UIControlStateNormal];

[exitButtonaddTarget:selfaction:@selector(exitButtonAction:)forControlEvents:UIControlEventTouchUpInside];

[selfaddSubview:exitButton];

}

-(void)exitButtonAction:(UIButton*)exitButton{

HJLog(@"退出按钮事件---");

if([_delegaterespondsToSelector:@selector(exitButtonAction:)]) {

[_delegateexitButtonAction:self];

}

}

-(void)dealloc{

NSLog(@"===HJHoledView===dealloc===");

}

#pragma mark - UIView Overrides

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event

{

UIView*hitView = [superhitTest:pointwithEvent:event];

HJLog(@"===hitTest===");

if(hitView ==self)

{

for(HJHole* holeinself.holes) {

if(hole.holeType==HJHoleTypeRoundedRect) {

HJRoundedRectHole*rectHole = (HJRoundedRectHole*)hole;

if(CGRectContainsPoint(rectHole.holeRect, point)){

HJLog(@"===点击到1===");

returnnil;

}

}elseif(hole.holeType==HJHoleTypeRect) {

HJRectHole*rectHole = (HJRectHole*)hole;

if(CGRectContainsPoint(rectHole.holeRect, point)){

HJLog(@"===点击到2===");

returnnil;

}

}elseif(hole.holeType==HJHoleTypeCirle) {

HJCircleHole*circleHole = (HJCircleHole*)hole;

CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),

floorf(circleHole.holeCenterPoint.y- circleHole.holeDiameter*0.5f),

circleHole.holeDiameter,

circleHole.holeDiameter);

if(CGRectContainsPoint(rectInView, point)){

HJLog(@"===点击到3===");

returnnil;

}

}

}

//for (UIView *focus in self.focusView) {

//if (CGRectContainsPoint(focus.frame, point))

//{HJLog(@"focus.frame:%f,point:%f",focus.frame.size.height,point.y);

//return focus;

//}

//}

}

returnhitView;

}

- (void)drawRect:(CGRect)rect

{

[selfremoveCustomViews];

CGContextRefcontext =UIGraphicsGetCurrentContext();

if(context ==nil) {

return;

}

[self.dimingColorsetFill];

UIRectFill(rect);

for(HJHole* holeinself.holes) {

[[UIColorclearColor]setFill];

if(hole.holeType==HJHoleTypeRoundedRect) {

HJRoundedRectHole*rectHole = (HJRoundedRectHole*)hole;

CGRectholeRectIntersection =CGRectIntersection( rectHole.holeRect,self.frame);

UIBezierPath*bezierPath = [UIBezierPathbezierPathWithRoundedRect:holeRectIntersection

cornerRadius:rectHole.holeCornerRadius];

CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), [[UIColorclearColor]CGColor]);

CGContextAddPath(UIGraphicsGetCurrentContext(), bezierPath.CGPath);

CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeClear);

CGContextFillPath(UIGraphicsGetCurrentContext());

}elseif(hole.holeType==HJHoleTypeRect) {

HJRectHole*rectHole = (HJRectHole*)hole;

CGRectholeRectIntersection =CGRectIntersection( rectHole.holeRect,self.frame);

UIRectFill( holeRectIntersection );

}elseif(hole.holeType==HJHoleTypeCirle) {

HJCircleHole*circleHole = (HJCircleHole*)hole;

CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),

floorf(circleHole.holeCenterPoint.y- circleHole.holeDiameter*0.5f),

circleHole.holeDiameter,

circleHole.holeDiameter);

CGContextSetFillColorWithColor( context, [UIColorclearColor].CGColor);

CGContextSetBlendMode(context,kCGBlendModeClear);

CGContextFillEllipseInRect( context, rectInView );

}

}

[selfaddCustomViews];

}

#pragma mark - Add methods

- (NSInteger)addHoleCircleCenteredOnPosition:(CGPoint)centerPoint andDiameter:(CGFloat)diameter

{

HJCircleHole*circleHole = [HJCircleHolenew];

circleHole.holeCenterPoint= centerPoint;

circleHole.holeDiameter= diameter;

circleHole.holeType=HJHoleTypeCirle;

[self.holesaddObject:circleHole];

[selfsetNeedsDisplay];

return[self.holesindexOfObject:circleHole];

}

- (NSInteger)addHoleRectOnRect:(CGRect)rect

{

HJRectHole*rectHole = [HJRectHolenew];

rectHole.holeRect= rect;

rectHole.holeType=HJHoleTypeRect;

[self.holesaddObject:rectHole];

[selfsetNeedsDisplay];

return[self.holesindexOfObject:rectHole];

}

- (NSInteger)addHoleRoundedRectOnRect:(CGRect)rect withCornerRadius:(CGFloat)cornerRadius

{

HJRoundedRectHole*rectHole = [HJRoundedRectHolenew];

rectHole.holeRect= rect;

rectHole.holeCornerRadius= cornerRadius;

rectHole.holeType=HJHoleTypeRoundedRect;

[self.holesaddObject:rectHole];

[selfsetNeedsDisplay];

return[self.holesindexOfObject:rectHole];

}

- (NSInteger)addHCustomView:(UIView*)customView onRect:(CGRect)rect

{

HJCustomRectHole*customHole = [HJCustomRectHolenew];

customHole.holeRect= rect;

customHole.customView= customView;

customHole.holeType=HJHoleTypeCustomRect;

[self.holesaddObject:customHole];

[selfsetNeedsDisplay];

return[self.holesindexOfObject:customHole];

}

- (void)addFocusView:(UIView*)focus

{

//[self.focusView addObject:focus];

[selfaddSubview:focus];

}

- (void)removeHoles:(BOOL)_isAnimation

{

if(_isAnimation){

//添加动画

[selfdisappearAnimation];

}else{

[selfendAnimationFinish];

}

}

#pragma mark - Overided setter

- (void)setDimingColor:(UIColor*)dimingColor

{

_dimingColor= dimingColor;

[selfsetNeedsDisplay];

}

#pragma mark - Tap Gesture

- (NSUInteger)holeViewIndexForAtPoint:(CGPoint)touchLocation

{

__blockNSUIntegeridxToReturn =NSNotFound;

[self.holesenumerateObjectsUsingBlock:^(HJHole*hole,NSUIntegeridx,BOOL*stop) {

if(hole.holeType==HJHoleTypeRoundedRect||

hole.holeType==HJHoleTypeRect||

hole.holeType==HJHoleTypeCustomRect) {

HJRectHole*rectHole = (HJRectHole*)hole;

if(CGRectContainsPoint(rectHole.holeRect, touchLocation)) {

idxToReturn = idx;

*stop =YES;

}

}elseif(hole.holeType==HJHoleTypeCirle) {

HJCircleHole*circleHole = (HJCircleHole*)hole;

CGRectrectInView =CGRectMake(floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),

floorf(circleHole.holeCenterPoint.x- circleHole.holeDiameter*0.5f),

circleHole.holeDiameter,

circleHole.holeDiameter);

if(CGRectContainsPoint(rectInView, touchLocation)) {

idxToReturn = idx;

*stop =YES;

}

}

}];

returnidxToReturn;

}

#pragma mark - Custom Views

- (void)removeCustomViews

{

[self.holesenumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {

if([objisKindOfClass:[HJCustomRectHoleclass]]) {

HJCustomRectHole*hole = (HJCustomRectHole*)obj;

[hole.customViewremoveFromSuperview];

}

}];

}

- (void)addCustomViews

{

[self.holesenumerateObjectsUsingBlock:^(idobj,NSUIntegeridx,BOOL*stop) {

if([objisKindOfClass:[HJCustomRectHoleclass]]) {

HJCustomRectHole*hole = (HJCustomRectHole*)obj;

[hole.customViewsetFrame:hole.holeRect];

[selfaddSubview:hole.customView];

}

}];

}

#pragma mark Prompt label

//提示文字返回UILabel方便修改字体大小颜色等

- (UILabel*)addPromptLabelText:(NSString*)_textStr onRect:(CGRect)rect{

UILabel*promptLabel=[[UILabelalloc]initWithFrame:rect];

[promptLabelsetFont:[UIFontsystemFontOfSize:20]];

[promptLabelsetTextColor:[UIColorwhiteColor]];

[promptLabelsetTextAlignment:NSTextAlignmentCenter];

promptLabel.text=_textStr;

[selfaddSubview:promptLabel];

returnpromptLabel;

}

//添加箭头

-(void)addArrowView:(CGPoint)_startP endPoint:(CGPoint)_endP{

HJArrowView*arrowView=[[HJArrowViewalloc]initWithFrame:self.frame];

arrowView.startP=_startP;

arrowView.endP=_endP;

[arrowViewdrawLine:self];

}

//添加图片箭头

-(void)addImgArrowView:(CGPoint)_point rotation:(UIImageOrientation)_orientation{

HJArrowView*arrowView=[[HJArrowViewalloc]initWithFrame:self.frame];

arrowView.imgPoint=_point;

arrowView.orientation=_orientation;

[arrowViewimageArrow:self];

}

#pragma mark动画

-(void)showAnimation{

self.alpha=0;

[UIViewbeginAnimations:@"endAnimation"context:nil];

[UIViewsetAnimationBeginsFromCurrentState:YES];//保持当前位置状态

[UIViewsetAnimationDuration:0.5f];

[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];

self.alpha=1;

[UIViewcommitAnimations];

}

-(void)disappearAnimation{

if(_delegate&& [_delegaterespondsToSelector:@selector(animationViewRemove:)]){

[_delegateanimationViewRemove:self];

}

[UIViewbeginAnimations:@"endAnimation"context:nil];

[UIViewsetAnimationBeginsFromCurrentState:YES];//保持当前位置状态

[UIViewsetAnimationDelegate:self];

[UIViewsetAnimationDidStopSelector:@selector(endAnimationFinish)];

[UIViewsetAnimationDuration:0.5f];

[UIViewsetAnimationCurve:UIViewAnimationCurveLinear];

self.alpha=0;

[UIViewcommitAnimations];

}

-(void)endAnimationFinish{

if([_delegaterespondsToSelector:@selector(animationDidOver:)]) {

[_delegateanimationDidOver:self];

}

[self.holesremoveAllObjects];

[self.focusViewremoveAllObjects];

[selfremoveCustomViews];

[selfsetNeedsDisplay];

[selfremoveFromSuperview];

}

@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Qt代码实现遮罩实现等待加载效果的示例代码: ```python from PyQt5.QtCore import QSize, Qt, QThread, pyqtSignal from PyQt5.QtGui import QMovie from PyQt5.QtWidgets import QApplication, QWidget, QLabel class LoadingMask(QWidget): def __init__(self, parent): super().__init__(parent) self.setFixedSize(parent.size()) self.setStyleSheet('background-color: rgba(0, 0, 0, 128);') self.movie = QMovie('loading.gif') self.movie.setScaledSize(QSize(100, 100)) label = QLabel(self) label.setMovie(self.movie) label.move(self.width() // 2 - 50, self.height() // 2 - 50) def start(self): self.movie.start() def stop(self): self.movie.stop() self.hide() class WorkerThread(QThread): finished = pyqtSignal() def run(self): # 模拟耗时操作 import time time.sleep(5) self.finished.emit() class MainWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle('遮罩实现等待加载效果') self.resize(500, 500) self.loading_mask = LoadingMask(self) self.worker_thread = WorkerThread(self) self.worker_thread.finished.connect(self.on_finished) def on_finished(self): self.loading_mask.stop() def do_something(self): self.loading_mask.start() self.worker_thread.start() if __name__ == '__main__': import sys app = QApplication(sys.argv) window = MainWindow() window.show() window.do_something() sys.exit(app.exec_()) ``` 这个示例代码中,首先定义了一个LoadingMask类,它继承自QWidget,用于实现遮罩层和等待加载动画的显示和隐藏。在LoadingMask的构造函数中,设置其大小和背景颜色,并创建一个QMovie用于加载动画gif,然后将QMovie放置在遮罩层中央。start和stop方法用于启动和停止动画和遮罩层的显示。 MainWindow继承自QWidget,是主窗口类。它包含了一个LoadingMask实例和一个WorkerThread实例。do_something方法用于启动等待加载的操作,它首先调用LoadingMask的start方法显示遮罩层和加载动画,然后启动WorkerThread执行耗时操作。WorkerThread是QThread的子类,用于模拟耗时操作,它执行完成后会发送一个finished信号。MainWindow的on_finished方法用于接收WorkerThread发送的finished信号,并调用LoadingMask的stop方法隐藏遮罩层和动画。 在主函数中,创建一个QApplication实例和MainWindow实例,然后调用MainWindow的show方法显示主窗口,并调用do_something方法启动等待加载的操作。最后调用QApplication的exec_方法进入Qt事件循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值