国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

等待時動畫效果的實現

2019-11-14 18:33:45
字體:
來源:轉載
供稿:網友

當我們在請求網絡時加載頁面時有個動作效果,效果如下:

源代碼可以網上找開源項目Coding.net,上面的效果原理為兩張圖片組合,外面那個則為動畫轉動,里面的圖標則是透明度的變化;主要代碼如下:

1:把它封裝在EaseLoadingView里面

@interface EaseLoadingView : UIView@PRoperty (strong, nonatomic) UIImageView *loopView, *monkeyView;@property (assign, nonatomic, readonly) BOOL isLoading;- (void)startAnimating;- (void)stopAnimating;@end
@interface EaseLoadingView ()@property (nonatomic, assign) CGFloat loopAngle, monkeyAlpha, angleStep, alphaStep;@end@implementation EaseLoadingView- (instancetype)initWithFrame:(CGRect)frame{    self = [super initWithFrame:frame];    if (self) {        self.backgroundColor = [UIColor clearColor];        _loopView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loading_loop"]];        _monkeyView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loading_monkey"]];        [_loopView setCenter:self.center];        [_monkeyView setCenter:self.center];        [self addSubview:_loopView];        [self addSubview:_monkeyView];        [_loopView mas_makeConstraints:^(MASConstraintMaker *make) {            make.center.equalTo(self);        }];        [_monkeyView mas_makeConstraints:^(MASConstraintMaker *make) {            make.center.equalTo(self);        }];                _loopAngle = 0.0;        _monkeyAlpha = 1.0;        _angleStep = 360/3;        _alphaStep = 1.0/3.0;    }    return self;}- (void)startAnimating{    self.hidden = NO;    if (_isLoading) {        return;    }    _isLoading = YES;    [self loadingAnimation];}- (void)stopAnimating{    self.hidden = YES;    _isLoading = NO;}- (void)loadingAnimation{    static CGFloat duration = 0.25f;    _loopAngle += _angleStep;    if (_monkeyAlpha >= 1.0 || _monkeyAlpha <= 0.0) {        _alphaStep = -_alphaStep;    }    _monkeyAlpha += _alphaStep;    [UIView animateWithDuration:duration delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^{        CGAffineTransform loopAngleTransform = CGAffineTransformMakeRotation(_loopAngle * (M_PI / 180.0f));        _loopView.transform = loopAngleTransform;        _monkeyView.alpha = _monkeyAlpha;    } completion:^(BOOL finished) {        if (_isLoading && [self superview] != nil) {            [self loadingAnimation];        }else{            [self removeFromSuperview];            _loopAngle = 0.0;            _monkeyAlpha = 1,0;            _alphaStep = ABS(_alphaStep);            CGAffineTransform loopAngleTransform = CGAffineTransformMakeRotation(_loopAngle * (M_PI / 180.0f));            _loopView.transform = loopAngleTransform;            _monkeyView.alpha = _monkeyAlpha;        }    }];}@end

注意loadingAnimation這里面有動作的處理及透明度的處理,當停止加載后把它自個從當前的視圖去除;

2:UIView (Common)在UIView擴展類里

#pragma mark LoadingView@property (strong, nonatomic) EaseLoadingView *loadingView;- (void)beginLoading;- (void)endLoading;@end
- (void)setLoadingView:(EaseLoadingView *)loadingView{    [self willChangeValueForKey:@"LoadingViewKey"];    objc_setAssociatedObject(self, &LoadingViewKey,                             loadingView,                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);    [self didChangeValueForKey:@"LoadingViewKey"];}- (EaseLoadingView *)loadingView{    return objc_getAssociatedObject(self, &LoadingViewKey);}- (void)beginLoading{    for (UIView *aView in [self.blankPageContainer subviews]) {        if ([aView isKindOfClass:[EaseBlankPageView class]] && !aView.hidden) {            return;        }    }        if (!self.loadingView) { //初始化LoadingView        self.loadingView = [[EaseLoadingView alloc] initWithFrame:self.bounds];    }    [self addSubview:self.loadingView];    [self.loadingView mas_makeConstraints:^(MASConstraintMaker *make) {        make.self.edges.equalTo(self);    }];    [self.loadingView startAnimating];}- (void)endLoading{    if (self.loadingView) {        [self.loadingView stopAnimating];    }}

注意:cocoa的KVO模型中,有兩種通知觀察者的方式,自動通知和手動通知。顧名思義,自動通知由cocoa在屬性值變化時自動通知觀察者,而手動通知需要在值變化時調用 willChangeValueForKey:和didChangeValueForKey: 方法通知調用者。

3:使用頁面調用

- (void)sendRequest{    [self.view beginLoading];    __weak typeof(self) weakSelf = self;    [[Coding_NetAPIManager sharedManager] request_CodeFile:_myCodeFile withPro:_myProject andBlock:^(id data, NSError *error) {        [weakSelf.view endLoading];        if (data) {            weakSelf.myCodeFile = data;            [weakSelf refreshCodeViewData];        }        [weakSelf.view configBlankPage:EaseBlankPageTypeView hasData:(data != nil) hasError:(error != nil) reloadButtonBlock:^(id sender) {            [weakSelf sendRequest];        }];    }];}

其中[self.view beginLoading]跟[weakSelf.view endLoading]就可以調用動畫效果;

 

補充:另一種是有很多不同的圖片組成的動畫效果,可以用每一張圖片然后FOR遍歷組成出動作效果;

    //設置普通狀態的動畫圖片    NSMutableArray *idleImages = [NSMutableArray array];    for (NSUInteger i = 1; i<=60; ++i) {               UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_anim__000%zd",i]];               [idleImages addObject:image];        [idleImages addObject:image];    }

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高清| 青冈县| 华蓥市| 广昌县| 文登市| 嘉定区| 巍山| 关岭| 丁青县| 阿图什市| 吉安县| 本溪市| 海伦市| 藁城市| 甘孜县| 万年县| 泽库县| 普兰店市| 专栏| 秦皇岛市| 金昌市| 天峻县| 庄河市| 奉新县| 孟州市| 修文县| 积石山| 达孜县| 罗山县| 竹山县| 阿拉善右旗| 温宿县| 宁津县| 西城区| 黑水县| 铁岭县| 木里| 泸定县| 大英县| 茌平县| 林西县|