hyzp_ybqx-Commit001:代码刚转换好,编译通过
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// DataReport.h
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/7/10.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface DataReport : NSObject
|
||||
|
||||
+ (void)report:(NSString *)action param:(NSDictionary *)param;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,127 @@
|
||||
//
|
||||
// DataReport.m
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/7/10.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import "DataReport.h"
|
||||
|
||||
//错误码
|
||||
#define kError_InvalidParam -10001
|
||||
#define kError_ConvertJsonFailed -10002
|
||||
#define kError_HttpError -10003
|
||||
|
||||
//数据上报
|
||||
#define DEFAULT_ELK_HOST @"https://ilivelog.qcloud.com"
|
||||
#define kHttpTimeout 30
|
||||
@implementation DataReport
|
||||
|
||||
+ (void)report:(NSString *)action param:(NSDictionary *)param
|
||||
{
|
||||
NSMutableDictionary *dict = @{}.mutableCopy;
|
||||
if (param) {
|
||||
[dict addEntriesFromDictionary:param];
|
||||
}
|
||||
[dict setObject:@"superplayer" forKey:@"bussiness"];
|
||||
[dict setObject:@"ios" forKey:@"platform"];
|
||||
[dict setObject:@"log" forKey:@"type"];
|
||||
[dict setObject:action?:@"" forKey:@"action"];
|
||||
[dict setObject:[[NSBundle mainBundle] bundleIdentifier] forKey:@"appidentifier"];
|
||||
[dict setObject:[DataReport getPackageName] forKey:@"appname"];
|
||||
|
||||
[self report:dict handler:^(int resultCode, NSString *message) {
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
+ (NSString *)getPackageName {
|
||||
static NSString *packname = nil;
|
||||
if (packname)
|
||||
return packname;
|
||||
|
||||
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
|
||||
packname = [infoDict objectForKey:@"CFBundleDisplayName"];
|
||||
if (packname == nil || [packname isEqual:@""]) {
|
||||
packname = [infoDict objectForKey:@"CFBundleIdentifier"];
|
||||
}
|
||||
return packname;
|
||||
}
|
||||
|
||||
|
||||
+ (void)report:(NSMutableDictionary *)param handler:(void (^)(int resultCode, NSString *message))handler;
|
||||
{
|
||||
dispatch_async(dispatch_get_global_queue(0, 0), ^{
|
||||
NSData* data = [self dictionary2JsonData:param];
|
||||
if (data == nil)
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (handler) handler(kError_ConvertJsonFailed, nil);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
NSMutableString *strUrl = [[NSMutableString alloc] initWithString:DEFAULT_ELK_HOST];
|
||||
|
||||
NSURL *URL = [NSURL URLWithString:strUrl];
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
|
||||
|
||||
if (data)
|
||||
{
|
||||
[request setValue:[NSString stringWithFormat:@"%ld",(long)[data length]] forHTTPHeaderField:@"Content-Length"];
|
||||
[request setHTTPMethod:@"POST"];
|
||||
[request setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
|
||||
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
|
||||
|
||||
[request setHTTPBody:data];
|
||||
}
|
||||
|
||||
[request setTimeoutInterval:kHttpTimeout];
|
||||
|
||||
|
||||
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||
if (error != nil)
|
||||
{
|
||||
NSLog(@"internalSendRequest failed,NSURLSessionDataTask return error code:%ld, des:%@", (long)[error code], [error description]);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if (handler) handler(kError_HttpError, nil);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
if ([responseString isEqualToString:@"ok"]) {
|
||||
if (handler) handler(0, responseString);
|
||||
}else{
|
||||
if (handler) handler(-1, responseString);
|
||||
}
|
||||
});
|
||||
}
|
||||
}];
|
||||
|
||||
[task resume];
|
||||
});
|
||||
}
|
||||
|
||||
+ (NSData *)dictionary2JsonData:(NSDictionary *)dict
|
||||
{
|
||||
// 转成Json数据
|
||||
if ([NSJSONSerialization isValidJSONObject:dict])
|
||||
{
|
||||
NSError *error = nil;
|
||||
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
|
||||
if(error)
|
||||
{
|
||||
NSLog(@"[%@] Post Json Error", [self class]);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"[%@] Post Json is not valid", [self class]);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
@end
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// J2Obj.h
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/6/25.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef J2Obj_h
|
||||
#define J2Obj_h
|
||||
|
||||
|
||||
NSArray *J2Array(id value);
|
||||
|
||||
NSString *J2Str(id value);
|
||||
|
||||
NSNumber *J2Num(id value);
|
||||
|
||||
#endif /* J2Obj_h */
|
||||
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// J2Obj.m
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/6/25.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "J2Obj.h"
|
||||
|
||||
|
||||
NSArray *J2Array(id value) {
|
||||
id obj = value;
|
||||
id ret;
|
||||
if ([obj isKindOfClass:[NSArray class]])
|
||||
{
|
||||
ret = obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = @[];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
NSString * J2Str(id value) {
|
||||
id obj = value;
|
||||
id ret;
|
||||
if ([obj isKindOfClass:[NSString class]])
|
||||
{
|
||||
ret = obj;
|
||||
}
|
||||
else if ([obj isKindOfClass:[NSNumber class]])
|
||||
{
|
||||
ret = [obj stringValue];
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = @"";
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
NSNumber *J2Num(id value) {
|
||||
id obj = value;
|
||||
id ret;
|
||||
if ([obj isKindOfClass:[NSString class]])
|
||||
{
|
||||
ret = [NSNumber numberWithDouble:[obj doubleValue]];
|
||||
}
|
||||
else if ([obj isKindOfClass:[NSNumber class]])
|
||||
{
|
||||
ret = obj;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = @0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// NetWatcher.h
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/7/31.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "SuperPlayerModel.h"
|
||||
|
||||
@interface NetWatcher : NSObject
|
||||
|
||||
@property (copy) void (^notifyTipsBlock)(NSString *);
|
||||
|
||||
@property (nonatomic) SuperPlayerModel *playerModel;
|
||||
|
||||
- (void)startWatch;
|
||||
- (void)stopWatch;
|
||||
|
||||
- (void)loadingEvent;
|
||||
- (void)loadingEndEvent;
|
||||
|
||||
@property NSString *adviseDefinition;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,169 @@
|
||||
//
|
||||
// NetWatcher.m
|
||||
// TXLiteAVDemo
|
||||
//
|
||||
// Created by annidyfeng on 2018/7/31.
|
||||
// Copyright © 2018年 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NetWatcher.h"
|
||||
#import "AFNetworking/AFNetworking.h"
|
||||
#import "SuperPlayerModelInternal.h"
|
||||
|
||||
@interface NetWatcher()
|
||||
@property NSArray *definitions;
|
||||
@end
|
||||
|
||||
@implementation NetWatcher {
|
||||
NSDate *_startTime;
|
||||
int _loadingCount;
|
||||
dispatch_source_t _timer1;
|
||||
BOOL _onFire;
|
||||
}
|
||||
|
||||
- (void)setPlayerModel:(SuperPlayerModel *)playerModel
|
||||
{
|
||||
_playerModel = playerModel;
|
||||
|
||||
self.definitions = [self.playerModel.playDefinitions sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
|
||||
return [NetWatcher weightOfDefinition:obj1] < [NetWatcher weightOfDefinition:obj2];
|
||||
}];
|
||||
|
||||
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
|
||||
self.adviseDefinition = self.definitions.lastObject;
|
||||
} else {
|
||||
self.adviseDefinition = self.definitions.firstObject;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)startWatch
|
||||
{
|
||||
[self stopWatch];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
|
||||
|
||||
if (self.definitions.count <= 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
_startTime = [NSDate date];
|
||||
_loadingCount = 0;
|
||||
|
||||
NSLog(@"NetWatcher: startWatch");
|
||||
}
|
||||
|
||||
- (void)stopWatch
|
||||
{
|
||||
_startTime = nil;
|
||||
if (_timer1) {
|
||||
if (!_onFire) {
|
||||
dispatch_resume(_timer1);
|
||||
}
|
||||
dispatch_source_cancel(_timer1);
|
||||
_timer1 = nil;
|
||||
}
|
||||
_onFire = NO;
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
- (void)loadingEvent
|
||||
{
|
||||
if (!_startTime)
|
||||
return;
|
||||
NSLog(@"NetWatcher: loadingEvent");
|
||||
if (_timer1 == nil) {
|
||||
_timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
|
||||
dispatch_source_set_timer(_timer1, DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
|
||||
__weak NetWatcher *weakSelf = self;
|
||||
dispatch_source_set_event_handler(_timer1, ^{
|
||||
NetWatcher *strongSelf = weakSelf;
|
||||
NSLog(@"NetWatcher: time out");
|
||||
if (strongSelf) {
|
||||
strongSelf->_loadingCount++;
|
||||
[strongSelf testNotify];
|
||||
}
|
||||
});
|
||||
}
|
||||
if (!_onFire) {
|
||||
dispatch_resume(_timer1);
|
||||
}
|
||||
_onFire = YES;
|
||||
}
|
||||
|
||||
- (void)loadingEndEvent
|
||||
{
|
||||
if (_onFire) {
|
||||
dispatch_suspend(_timer1);
|
||||
_onFire = NO;
|
||||
_loadingCount++;
|
||||
}
|
||||
NSLog(@"NetWatcher: loadingEndEvent");
|
||||
}
|
||||
|
||||
- (BOOL)testNotify
|
||||
{
|
||||
if (-[_startTime timeIntervalSinceNow] > 30) {
|
||||
[self stopWatch]; // 超过30秒不检测了
|
||||
return NO;
|
||||
}
|
||||
|
||||
// 暂定30秒缓冲次数超过2次,为网络不好
|
||||
if (_loadingCount >= 2) {
|
||||
|
||||
NSUInteger i = [self.definitions indexOfObject:self.adviseDefinition];
|
||||
if (i < self.definitions.count-1) {
|
||||
self.adviseDefinition = self.definitions[i+1];
|
||||
}
|
||||
|
||||
if (self.notifyTipsBlock) {
|
||||
self.notifyTipsBlock(@"检测到你的网络较差,建议切换清晰度");
|
||||
}
|
||||
_loadingCount = 0;
|
||||
[self stopWatch];
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)networkChanged:(NSNotification *)noti
|
||||
{
|
||||
if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN) {
|
||||
self.adviseDefinition = self.definitions.lastObject;
|
||||
if (self.adviseDefinition && ![self.playerModel.playingDefinition isEqualToString:self.adviseDefinition]) {
|
||||
self.notifyTipsBlock([@"当前网络为4G,建议切换到" stringByAppendingString:self.adviseDefinition]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+(int)weightOfDefinition:(NSString *)def
|
||||
{
|
||||
if ([def isEqualToString:@"流畅"]) {
|
||||
return 10;
|
||||
}
|
||||
if ([def isEqualToString:@"标清"]) {
|
||||
return 15;
|
||||
}
|
||||
if ([def isEqualToString:@"高清"]) {
|
||||
return 20;
|
||||
}
|
||||
if ([def isEqualToString:@"全高清"]) {
|
||||
return 40;
|
||||
}
|
||||
if ([def isEqualToString:@"超清"]) {
|
||||
return 50;
|
||||
}
|
||||
if ([def isEqualToString:@"原画"]) {
|
||||
return 60;
|
||||
}
|
||||
if ([def isEqualToString:@"2K"]) {
|
||||
return 70;
|
||||
}
|
||||
if ([def isEqualToString:@"4K"]) {
|
||||
return 80;
|
||||
}
|
||||
return 10000;
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// StrUtils.h
|
||||
// Pods
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface StrUtils : NSObject
|
||||
|
||||
+ (NSString *)timeFormat:(NSInteger)totalTime;
|
||||
@end
|
||||
|
||||
extern NSString *kStrLoadFaildRetry;
|
||||
extern NSString *kStrBadNetRetry;
|
||||
extern NSString *kStrTimeShiftFailed;
|
||||
extern NSString *kStrHDSwitchFailed;
|
||||
extern NSString *kStrWeakNet;
|
||||
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// StrUtils.m
|
||||
// Pods
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import "StrUtils.h"
|
||||
|
||||
NSString *kStrLoadFaildRetry = @"加载失败,点击重试";
|
||||
NSString *kStrBadNetRetry = @"网络不给力,点击重试";
|
||||
NSString *kStrTimeShiftFailed = @"时移失败,返回直播";
|
||||
NSString *kStrHDSwitchFailed = @"清晰度切换失败";
|
||||
NSString *kStrWeakNet = @"检测到你的网络较差,建议切换清晰度";
|
||||
|
||||
@implementation StrUtils
|
||||
|
||||
+ (NSString *)timeFormat:(NSInteger)totalTime {
|
||||
if (totalTime < 0) {
|
||||
return @"";
|
||||
}
|
||||
NSInteger durHour = totalTime / 3600;
|
||||
NSInteger durMin = (totalTime / 60) % 60;
|
||||
NSInteger durSec = totalTime % 60;
|
||||
|
||||
if (durHour > 0) {
|
||||
return [NSString stringWithFormat:@"%zd:%02zd:%02zd", durHour, durMin, durSec];
|
||||
} else {
|
||||
return [NSString stringWithFormat:@"%02zd:%02zd", durMin, durSec];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// TXBitrateItemHelper.h
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "SuperPlayerModel.h"
|
||||
#import "SuperPlayer.h"
|
||||
|
||||
@class TXBitrateItem;
|
||||
@interface TXBitrateItemHelper : NSObject
|
||||
@property NSInteger bitrate;
|
||||
@property NSString *title;
|
||||
@property int index;
|
||||
|
||||
+ (NSArray<SuperPlayerUrl *> *)sortWithBitrate:(NSArray<TXBitrateItem *> *)bitrates;
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// TXBitrateItemHelper.m
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import "TXBitrateItemHelper.h"
|
||||
#import "TXBitrateItem.h"
|
||||
|
||||
@implementation TXBitrateItemHelper
|
||||
|
||||
+ (NSArray<SuperPlayerUrl *> *)sortWithBitrate:(NSArray<TXBitrateItem *> *)bitrates {
|
||||
NSMutableArray *origin = [NSMutableArray new];
|
||||
NSArray *titles = @[@"流畅",@"高清",@"超清",@"原画",@"2K",@"4K"];
|
||||
NSMutableArray *retArray = [[NSMutableArray alloc] initWithCapacity:bitrates.count];
|
||||
|
||||
for (int i = 0; i < bitrates.count; i++) {
|
||||
TXBitrateItemHelper *h = [TXBitrateItemHelper new];
|
||||
h.bitrate = bitrates[i].bitrate;
|
||||
h.index = i;
|
||||
[origin addObject:h];
|
||||
[retArray addObject:[NSNull null]];
|
||||
}
|
||||
|
||||
NSArray *sorted = [origin sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"bitrate" ascending:YES]]];
|
||||
|
||||
[sorted enumerateObjectsUsingBlock:^(TXBitrateItemHelper *h, NSUInteger idx, BOOL *stop) {
|
||||
SuperPlayerUrl *sub = [SuperPlayerUrl new];
|
||||
sub.title = titles[idx];
|
||||
retArray[h.index] = sub;
|
||||
}];
|
||||
return retArray;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// TXCUrl.h
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/17.
|
||||
// Copyright © 2018年 annidy. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface TXCUrl : NSObject
|
||||
|
||||
- (instancetype)initWithString:(NSString *)url;
|
||||
|
||||
- (NSInteger)bizid;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// TXCUrl.m
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/17.
|
||||
// Copyright © 2018年 annidy. All rights reserved.
|
||||
//
|
||||
|
||||
#import "TXCUrl.h"
|
||||
|
||||
@implementation TXCUrl {
|
||||
NSURL *_url;
|
||||
}
|
||||
|
||||
- (instancetype)initWithString:(NSString *)url
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
_url = [NSURL URLWithString:url];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSInteger)bizid
|
||||
{
|
||||
NSString *bizId = nil;
|
||||
for (NSString *param in [_url.query componentsSeparatedByString:@"&"]) {
|
||||
NSArray *elts = [param componentsSeparatedByString:@"="];
|
||||
if([elts count] < 2) continue;
|
||||
if ([[elts firstObject] isEqualToString:@"bizid"]) {
|
||||
bizId = [elts lastObject];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bizId == nil) {
|
||||
bizId = [[_url host] componentsSeparatedByString:@"."].firstObject;
|
||||
}
|
||||
|
||||
NSInteger bizIdNum = [bizId integerValue];
|
||||
if (bizIdNum <= 0) {
|
||||
bizIdNum = -1;
|
||||
}
|
||||
return bizIdNum;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// UIView+Fade.h
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface UIView (Fade)
|
||||
|
||||
- (UIView *)fadeShow;
|
||||
- (void)fadeOut:(NSTimeInterval)delay;
|
||||
- (void)cancelFadeOut;
|
||||
@end
|
||||
@@ -0,0 +1,53 @@
|
||||
//
|
||||
// UIView+Fade.m
|
||||
// SuperPlayer
|
||||
//
|
||||
// Created by annidyfeng on 2018/9/28.
|
||||
//
|
||||
|
||||
#import "UIView+Fade.h"
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
||||
@implementation UIView (Fade)
|
||||
|
||||
- (NSNumber *)fadeSeeds{
|
||||
return objc_getAssociatedObject(self, @selector(fadeSeeds));
|
||||
}
|
||||
|
||||
- (void)setFadeSeeds:(NSNumber *)seeds{
|
||||
objc_setAssociatedObject(self, @selector(fadeSeeds), seeds, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||
}
|
||||
|
||||
- (void)cancelFadeOut
|
||||
{
|
||||
[self setFadeSeeds:@(arc4random_uniform(1000))];
|
||||
}
|
||||
|
||||
- (UIView *)fadeShow
|
||||
{
|
||||
[self cancelFadeOut];
|
||||
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
|
||||
self.hidden = NO;
|
||||
} completion:^(BOOL finished) {
|
||||
|
||||
}];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)fadeOut:(NSTimeInterval)delay
|
||||
{
|
||||
int seeds = [self.fadeSeeds intValue];
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
if (seeds == [self.fadeSeeds intValue]) {
|
||||
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
|
||||
self.hidden = YES;
|
||||
} completion:^(BOOL finished) {
|
||||
|
||||
}];
|
||||
[self cancelFadeOut];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user