Commit 05a34523e0b95a6380e8accf9f6d09d7381cf63e
1 parent
b2c41e70
提交0.0.1
Showing
34 changed files
with
3270 additions
and
0 deletions
Too many changes to show.
To preserve performance only 34 of 350 files are displayed.
.gitignore
0 → 100644
| 1 | +# OS X | |
| 2 | +.DS_Store | |
| 3 | + | |
| 4 | +# Xcode | |
| 5 | +build/ | |
| 6 | +Products/ | |
| 7 | +*.pbxuser | |
| 8 | +!default.pbxuser | |
| 9 | +*.mode1v3 | |
| 10 | +!default.mode1v3 | |
| 11 | +*.mode2v3 | |
| 12 | +!default.mode2v3 | |
| 13 | +*.perspectivev3 | |
| 14 | +!default.perspectivev3 | |
| 15 | +xcuserdata/ | |
| 16 | +*.xccheckout | |
| 17 | +profile | |
| 18 | +*.moved-aside | |
| 19 | +DerivedData | |
| 20 | +*.hmap | |
| 21 | +*.ipa | |
| 22 | + | |
| 23 | +# Bundler | |
| 24 | +.bundle | |
| 25 | + | |
| 26 | +# Add this line if you want to avoid checking in source code from Carthage dependencies. | |
| 27 | +# Carthage/Checkouts | |
| 28 | + | |
| 29 | +Carthage/Build | |
| 30 | + | |
| 31 | +# We recommend against adding the Pods directory to your .gitignore. However | |
| 32 | +# you should judge for yourself, the pros and cons are mentioned at: | |
| 33 | +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control | |
| 34 | +# | |
| 35 | +# Note: if you ignore the Pods directory, make sure to uncomment | |
| 36 | +# `pod install` in .travis.yml | |
| 37 | +# | |
| 38 | +# Pods/ | ... | ... |
.travis.yml
0 → 100644
| 1 | +# references: | |
| 2 | +# * https://www.objc.io/issues/6-build-tools/travis-ci/ | |
| 3 | +# * https://github.com/supermarin/xcpretty#usage | |
| 4 | + | |
| 5 | +osx_image: xcode7.3 | |
| 6 | +language: objective-c | |
| 7 | +# cache: cocoapods | |
| 8 | +# podfile: Example/Podfile | |
| 9 | +# before_install: | |
| 10 | +# - gem install cocoapods # Since Travis is not always on latest version | |
| 11 | +# - pod install --project-directory=Example | |
| 12 | +script: | |
| 13 | +- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/CNLiveTips.xcworkspace -scheme CNLiveTips-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty | |
| 14 | +- pod lib lint | ... | ... |
CNLiveTips.podspec
0 → 100644
| 1 | + | |
| 2 | + | |
| 3 | +Pod::Spec.new do |s| | |
| 4 | + s.name = 'CNLiveTips' | |
| 5 | + s.version = '0.0.1' | |
| 6 | + s.summary = '封装QMUI弹框' | |
| 7 | + | |
| 8 | + | |
| 9 | + s.description = <<-DESC | |
| 10 | +TODO: Add long description of the pod here. | |
| 11 | + DESC | |
| 12 | + | |
| 13 | + s.homepage = 'http://bj.gitlab.cnlive.com/ios-team/CNLiveTips' | |
| 14 | + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' | |
| 15 | + s.license = { :type => 'MIT', :file => 'LICENSE' } | |
| 16 | + s.author = { '殷巧娟' => '1427945373@qq.com' } | |
| 17 | + s.source = { :git => 'http://bj.gitlab.cnlive.com/ios-team/CNLiveTips.git', :tag => s.version.to_s } | |
| 18 | + # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' | |
| 19 | + | |
| 20 | + s.ios.deployment_target = '9.0' | |
| 21 | + | |
| 22 | + s.source_files = 'CNLiveTips/Classes/**/*' | |
| 23 | + | |
| 24 | + # s.resource_bundles = { | |
| 25 | + # 'CNLiveTips' => ['CNLiveTips/Assets/*.png'] | |
| 26 | + # } | |
| 27 | + | |
| 28 | + # s.public_header_files = 'Pod/Classes/**/*.h' | |
| 29 | + s.frameworks = 'UIKit', 'Foundation' | |
| 30 | + s.dependency 'QMUIKit' | |
| 31 | +end | ... | ... |
CNLiveTips/Assets/.gitkeep
0 → 100644
CNLiveTips/Classes/CNLiveTips.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveTips.h | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/25. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveToastView.h" | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | +// 自动计算秒数的标志符,在 delay 里面赋值 QMUITipsAutomaticallyHideToastSeconds 即可通过自动计算 tips 消失的秒数 | |
| 13 | +extern const NSInteger QMUITipsAutomaticallyHideToastSeconds; | |
| 14 | + | |
| 15 | +/// 默认的 parentView | |
| 16 | +#define DefaultTipsParentView [[[UIApplication sharedApplication] delegate] window] | |
| 17 | + | |
| 18 | +/** | |
| 19 | + * 简单封装了 QMUIToastView,支持弹出纯文本、loading、succeed、error、info 等五种 tips。如果这些接口还满足不了业务的需求,可以通过 QMUITips 的分类自行添加接口。 | |
| 20 | + * 注意用类方法显示 tips 的话,会导致父类的 willShowBlock 无法正常工作,具体请查看 willShowBlock 的注释。 | |
| 21 | + * @see [QMUIToastView willShowBlock] | |
| 22 | + */ | |
| 23 | +@interface CNLiveTips : CNLiveToastView | |
| 24 | +/// 实例方法:需要自己addSubview,hide之后不会自动removeFromSuperView | |
| 25 | + | |
| 26 | +- (void)showLoading; | |
| 27 | +- (void)showLoading:(nullable NSString *)text; | |
| 28 | +- (void)showLoadingHideAfterDelay:(NSTimeInterval)delay; | |
| 29 | +- (void)showLoading:(nullable NSString *)text hideAfterDelay:(NSTimeInterval)delay; | |
| 30 | +- (void)showLoading:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 31 | +- (void)showLoading:(nullable NSString *)text detailText:(nullable NSString *)detailText hideAfterDelay:(NSTimeInterval)delay; | |
| 32 | + | |
| 33 | +- (void)showWithText:(nullable NSString *)text; | |
| 34 | +- (void)showWithText:(nullable NSString *)text hideAfterDelay:(NSTimeInterval)delay; | |
| 35 | +- (void)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 36 | +- (void)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText hideAfterDelay:(NSTimeInterval)delay; | |
| 37 | + | |
| 38 | +- (void)showSucceed:(nullable NSString *)text; | |
| 39 | +- (void)showSucceed:(nullable NSString *)text hideAfterDelay:(NSTimeInterval)delay; | |
| 40 | +- (void)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 41 | +- (void)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText hideAfterDelay:(NSTimeInterval)delay; | |
| 42 | + | |
| 43 | +- (void)showError:(nullable NSString *)text; | |
| 44 | +- (void)showError:(nullable NSString *)text hideAfterDelay:(NSTimeInterval)delay; | |
| 45 | +- (void)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 46 | +- (void)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText hideAfterDelay:(NSTimeInterval)delay; | |
| 47 | + | |
| 48 | +- (void)showInfo:(nullable NSString *)text; | |
| 49 | +- (void)showInfo:(nullable NSString *)text hideAfterDelay:(NSTimeInterval)delay; | |
| 50 | +- (void)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 51 | +- (void)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText hideAfterDelay:(NSTimeInterval)delay; | |
| 52 | + | |
| 53 | +/// 类方法:主要用在局部一次性使用的场景,hide之后会自动removeFromSuperView | |
| 54 | + | |
| 55 | ++ (CNLiveTips *)createTipsToView:(UIView *)view; | |
| 56 | + | |
| 57 | ++ (CNLiveTips *)showLoadingInView:(UIView *)view; | |
| 58 | ++ (CNLiveTips *)showLoading:(nullable NSString *)text inView:(UIView *)view; | |
| 59 | ++ (CNLiveTips *)showLoadingInView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 60 | ++ (CNLiveTips *)showLoading:(nullable NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 61 | ++ (CNLiveTips *)showLoading:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view; | |
| 62 | ++ (CNLiveTips *)showLoading:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 63 | + | |
| 64 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text; | |
| 65 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 66 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text inView:(UIView *)view; | |
| 67 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 68 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view; | |
| 69 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 70 | + | |
| 71 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text; | |
| 72 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 73 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text inView:(UIView *)view; | |
| 74 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 75 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view; | |
| 76 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 77 | + | |
| 78 | ++ (CNLiveTips *)showError:(nullable NSString *)text; | |
| 79 | ++ (CNLiveTips *)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 80 | ++ (CNLiveTips *)showError:(nullable NSString *)text inView:(UIView *)view; | |
| 81 | ++ (CNLiveTips *)showError:(nullable NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 82 | ++ (CNLiveTips *)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view; | |
| 83 | ++ (CNLiveTips *)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 84 | + | |
| 85 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text; | |
| 86 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText; | |
| 87 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text inView:(UIView *)view; | |
| 88 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 89 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view; | |
| 90 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay; | |
| 91 | + | |
| 92 | +/// 隐藏 tips | |
| 93 | ++ (void)hideAllTipsInView:(UIView *)view; | |
| 94 | ++ (void)hideAllTips; | |
| 95 | + | |
| 96 | +/// 自动隐藏 toast 可以使用这个方法自动计算秒数 | |
| 97 | ++ (NSTimeInterval)smartDelaySecondsForTipsText:(NSString *)text; | |
| 98 | +@end | |
| 99 | + | |
| 100 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveTips/Classes/CNLiveTips.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveTips.m | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/25. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveTips.h" | |
| 10 | +#import <QMUIKit/QMUIKit.h> | |
| 11 | +#import "QMUICore.h" | |
| 12 | +#import "QMUIToastContentView.h" | |
| 13 | +#import "QMUIToastBackgroundView.h" | |
| 14 | +#import "NSString+QMUI.h" | |
| 15 | +const NSInteger QMUITipsAutomaticallyHideToastSeconds = -1; | |
| 16 | + | |
| 17 | +@interface CNLiveTips () | |
| 18 | +@property(nonatomic, strong) UIView *contentCustomView; | |
| 19 | +@end | |
| 20 | + | |
| 21 | +@implementation CNLiveTips | |
| 22 | +- (void)showLoading { | |
| 23 | + [self showLoading:nil hideAfterDelay:0]; | |
| 24 | +} | |
| 25 | + | |
| 26 | +- (void)showLoadingHideAfterDelay:(NSTimeInterval)delay { | |
| 27 | + [self showLoading:nil hideAfterDelay:delay]; | |
| 28 | +} | |
| 29 | + | |
| 30 | +- (void)showLoading:(NSString *)text { | |
| 31 | + [self showLoading:text hideAfterDelay:0]; | |
| 32 | +} | |
| 33 | + | |
| 34 | +- (void)showLoading:(NSString *)text hideAfterDelay:(NSTimeInterval)delay { | |
| 35 | + [self showLoading:text detailText:nil hideAfterDelay:delay]; | |
| 36 | +} | |
| 37 | + | |
| 38 | +- (void)showLoading:(NSString *)text detailText:(NSString *)detailText { | |
| 39 | + [self showLoading:text detailText:detailText hideAfterDelay:0]; | |
| 40 | +} | |
| 41 | +- (void)showLoading:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 42 | + UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; | |
| 43 | + [indicator startAnimating]; | |
| 44 | + self.contentCustomView = indicator; | |
| 45 | + [self showTipWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 46 | +} | |
| 47 | + | |
| 48 | +- (void)showWithText:(NSString *)text { | |
| 49 | + [self showWithText:text detailText:nil hideAfterDelay:0]; | |
| 50 | +} | |
| 51 | + | |
| 52 | +- (void)showWithText:(NSString *)text hideAfterDelay:(NSTimeInterval)delay { | |
| 53 | + [self showWithText:text detailText:nil hideAfterDelay:delay]; | |
| 54 | +} | |
| 55 | + | |
| 56 | +- (void)showWithText:(NSString *)text detailText:(NSString *)detailText { | |
| 57 | + [self showWithText:text detailText:detailText hideAfterDelay:0]; | |
| 58 | +} | |
| 59 | + | |
| 60 | +- (void)showWithText:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 61 | + self.contentCustomView = nil; | |
| 62 | + [self showTipWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 63 | +} | |
| 64 | + | |
| 65 | +- (void)showSucceed:(NSString *)text { | |
| 66 | + [self showSucceed:text detailText:nil hideAfterDelay:0]; | |
| 67 | +} | |
| 68 | + | |
| 69 | +- (void)showSucceed:(NSString *)text hideAfterDelay:(NSTimeInterval)delay { | |
| 70 | + [self showSucceed:text detailText:nil hideAfterDelay:delay]; | |
| 71 | +} | |
| 72 | + | |
| 73 | +- (void)showSucceed:(NSString *)text detailText:(NSString *)detailText { | |
| 74 | + [self showSucceed:text detailText:detailText hideAfterDelay:0]; | |
| 75 | +} | |
| 76 | + | |
| 77 | +- (void)showSucceed:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 78 | + self.contentCustomView = [[UIImageView alloc] initWithImage:[[QMUIHelper imageWithName:@"QMUI_tips_done"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; | |
| 79 | + [self showTipWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 80 | +} | |
| 81 | + | |
| 82 | +- (void)showError:(NSString *)text { | |
| 83 | + [self showError:text detailText:nil hideAfterDelay:0]; | |
| 84 | +} | |
| 85 | + | |
| 86 | +- (void)showError:(NSString *)text hideAfterDelay:(NSTimeInterval)delay { | |
| 87 | + [self showError:text detailText:nil hideAfterDelay:delay]; | |
| 88 | +} | |
| 89 | + | |
| 90 | +- (void)showError:(NSString *)text detailText:(NSString *)detailText { | |
| 91 | + [self showError:text detailText:detailText hideAfterDelay:0]; | |
| 92 | +} | |
| 93 | + | |
| 94 | +- (void)showError:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 95 | + self.contentCustomView = [[UIImageView alloc] initWithImage:[[QMUIHelper imageWithName:@"QMUI_tips_error"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; | |
| 96 | + [self showTipWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 97 | +} | |
| 98 | + | |
| 99 | +- (void)showInfo:(NSString *)text { | |
| 100 | + [self showInfo:text detailText:nil hideAfterDelay:0]; | |
| 101 | +} | |
| 102 | + | |
| 103 | +- (void)showInfo:(NSString *)text hideAfterDelay:(NSTimeInterval)delay { | |
| 104 | + [self showInfo:text detailText:nil hideAfterDelay:delay]; | |
| 105 | +} | |
| 106 | + | |
| 107 | +- (void)showInfo:(NSString *)text detailText:(NSString *)detailText { | |
| 108 | + [self showInfo:text detailText:detailText hideAfterDelay:0]; | |
| 109 | +} | |
| 110 | + | |
| 111 | +- (void)showInfo:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 112 | + self.contentCustomView = [[UIImageView alloc] initWithImage:[[QMUIHelper imageWithName:@"QMUI_tips_info"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]]; | |
| 113 | + [self showTipWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 114 | +} | |
| 115 | + | |
| 116 | +- (void)showTipWithText:(NSString *)text detailText:(NSString *)detailText hideAfterDelay:(NSTimeInterval)delay { | |
| 117 | + | |
| 118 | + QMUIToastContentView *contentView = (QMUIToastContentView *)self.contentView; | |
| 119 | + contentView.customView = self.contentCustomView; | |
| 120 | + | |
| 121 | + contentView.textLabelText = text ?: @""; | |
| 122 | + contentView.detailTextLabelText = detailText ?: @""; | |
| 123 | + | |
| 124 | + [self showAnimated:YES]; | |
| 125 | + | |
| 126 | + if (delay == QMUITipsAutomaticallyHideToastSeconds) { | |
| 127 | + [self hideAnimated:YES afterDelay:[CNLiveTips smartDelaySecondsForTipsText:text]]; | |
| 128 | + } else if (delay > 0) { | |
| 129 | + [self hideAnimated:YES afterDelay:delay]; | |
| 130 | + } | |
| 131 | +} | |
| 132 | + | |
| 133 | ++ (NSTimeInterval)smartDelaySecondsForTipsText:(NSString *)text { | |
| 134 | + NSUInteger length = text.qmui_lengthWhenCountingNonASCIICharacterAsTwo; | |
| 135 | + if (length <= 20) { | |
| 136 | + return 1.5; | |
| 137 | + } else if (length <= 40) { | |
| 138 | + return 2.0; | |
| 139 | + } else if (length <= 50) { | |
| 140 | + return 2.5; | |
| 141 | + } else { | |
| 142 | + return 3.0; | |
| 143 | + } | |
| 144 | +} | |
| 145 | + | |
| 146 | ++ (CNLiveTips *)showLoadingInView:(UIView *)view { | |
| 147 | + return [self showLoading:nil detailText:nil inView:view hideAfterDelay:0]; | |
| 148 | +} | |
| 149 | + | |
| 150 | ++ (CNLiveTips *)showLoading:(NSString *)text inView:(UIView *)view { | |
| 151 | + return [self showLoading:text detailText:nil inView:view hideAfterDelay:0]; | |
| 152 | +} | |
| 153 | + | |
| 154 | ++ (CNLiveTips *)showLoadingInView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 155 | + return [self showLoading:nil detailText:nil inView:view hideAfterDelay:delay]; | |
| 156 | +} | |
| 157 | + | |
| 158 | ++ (CNLiveTips *)showLoading:(NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 159 | + return [self showLoading:text detailText:nil inView:view hideAfterDelay:delay]; | |
| 160 | +} | |
| 161 | + | |
| 162 | ++ (CNLiveTips *)showLoading:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view { | |
| 163 | + return [self showLoading:text detailText:detailText inView:view hideAfterDelay:0]; | |
| 164 | +} | |
| 165 | + | |
| 166 | ++ (CNLiveTips *)showLoading:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 167 | + CNLiveTips *tips = [self createTipsToView:view]; | |
| 168 | + [tips showLoading:text detailText:detailText hideAfterDelay:delay]; | |
| 169 | + return tips; | |
| 170 | +} | |
| 171 | + | |
| 172 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text { | |
| 173 | + return [self showWithText:text detailText:nil inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 174 | +} | |
| 175 | + | |
| 176 | ++ (CNLiveTips *)showWithText:(nullable NSString *)text detailText:(nullable NSString *)detailText { | |
| 177 | + return [self showWithText:text detailText:detailText inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 178 | +} | |
| 179 | + | |
| 180 | ++ (CNLiveTips *)showWithText:(NSString *)text inView:(UIView *)view { | |
| 181 | + return [self showWithText:text detailText:nil inView:view hideAfterDelay:0]; | |
| 182 | +} | |
| 183 | + | |
| 184 | ++ (CNLiveTips *)showWithText:(NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 185 | + return [self showWithText:text detailText:nil inView:view hideAfterDelay:delay]; | |
| 186 | +} | |
| 187 | + | |
| 188 | ++ (CNLiveTips *)showWithText:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view { | |
| 189 | + return [self showWithText:text detailText:detailText inView:view hideAfterDelay:0]; | |
| 190 | +} | |
| 191 | + | |
| 192 | ++ (CNLiveTips *)showWithText:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 193 | + CNLiveTips *tips = [self createTipsToView:view]; | |
| 194 | + [tips showWithText:text detailText:detailText hideAfterDelay:delay]; | |
| 195 | + return tips; | |
| 196 | +} | |
| 197 | + | |
| 198 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text { | |
| 199 | + return [self showSucceed:text detailText:nil inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 200 | +} | |
| 201 | + | |
| 202 | ++ (CNLiveTips *)showSucceed:(nullable NSString *)text detailText:(nullable NSString *)detailText { | |
| 203 | + return [self showSucceed:text detailText:detailText inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 204 | +} | |
| 205 | + | |
| 206 | ++ (CNLiveTips *)showSucceed:(NSString *)text inView:(UIView *)view { | |
| 207 | + return [self showSucceed:text detailText:nil inView:view hideAfterDelay:0]; | |
| 208 | +} | |
| 209 | + | |
| 210 | ++ (CNLiveTips *)showSucceed:(NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 211 | + return [self showSucceed:text detailText:nil inView:view hideAfterDelay:delay]; | |
| 212 | +} | |
| 213 | + | |
| 214 | ++ (CNLiveTips *)showSucceed:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view { | |
| 215 | + return [self showSucceed:text detailText:detailText inView:view hideAfterDelay:0]; | |
| 216 | +} | |
| 217 | + | |
| 218 | ++ (CNLiveTips *)showSucceed:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 219 | + CNLiveTips *tips = [self createTipsToView:view]; | |
| 220 | + [tips showSucceed:text detailText:detailText hideAfterDelay:delay]; | |
| 221 | + return tips; | |
| 222 | +} | |
| 223 | + | |
| 224 | ++ (CNLiveTips *)showError:(nullable NSString *)text { | |
| 225 | + return [self showError:text detailText:nil inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 226 | +} | |
| 227 | + | |
| 228 | ++ (CNLiveTips *)showError:(nullable NSString *)text detailText:(nullable NSString *)detailText { | |
| 229 | + return [self showError:text detailText:detailText inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 230 | +} | |
| 231 | + | |
| 232 | ++ (CNLiveTips *)showError:(NSString *)text inView:(UIView *)view { | |
| 233 | + return [self showError:text detailText:nil inView:view hideAfterDelay:0]; | |
| 234 | +} | |
| 235 | + | |
| 236 | ++ (CNLiveTips *)showError:(NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 237 | + return [self showError:text detailText:nil inView:view hideAfterDelay:delay]; | |
| 238 | +} | |
| 239 | + | |
| 240 | ++ (CNLiveTips *)showError:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view { | |
| 241 | + return [self showError:text detailText:detailText inView:view hideAfterDelay:0]; | |
| 242 | +} | |
| 243 | + | |
| 244 | ++ (CNLiveTips *)showError:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 245 | + CNLiveTips *tips = [self createTipsToView:view]; | |
| 246 | + [tips showError:text detailText:detailText hideAfterDelay:delay]; | |
| 247 | + return tips; | |
| 248 | +} | |
| 249 | + | |
| 250 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text { | |
| 251 | + return [self showInfo:text detailText:nil inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 252 | +} | |
| 253 | + | |
| 254 | ++ (CNLiveTips *)showInfo:(nullable NSString *)text detailText:(nullable NSString *)detailText { | |
| 255 | + return [self showInfo:text detailText:detailText inView:DefaultTipsParentView hideAfterDelay:QMUITipsAutomaticallyHideToastSeconds]; | |
| 256 | +} | |
| 257 | + | |
| 258 | ++ (CNLiveTips *)showInfo:(NSString *)text inView:(UIView *)view { | |
| 259 | + return [self showInfo:text detailText:nil inView:view hideAfterDelay:0]; | |
| 260 | +} | |
| 261 | + | |
| 262 | ++ (CNLiveTips *)showInfo:(NSString *)text inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 263 | + return [self showInfo:text detailText:nil inView:view hideAfterDelay:delay]; | |
| 264 | +} | |
| 265 | + | |
| 266 | ++ (CNLiveTips *)showInfo:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view { | |
| 267 | + return [self showInfo:text detailText:detailText inView:view hideAfterDelay:0]; | |
| 268 | +} | |
| 269 | + | |
| 270 | ++ (CNLiveTips *)showInfo:(NSString *)text detailText:(NSString *)detailText inView:(UIView *)view hideAfterDelay:(NSTimeInterval)delay { | |
| 271 | + CNLiveTips *tips = [self createTipsToView:view]; | |
| 272 | + [tips showInfo:text detailText:detailText hideAfterDelay:delay]; | |
| 273 | + return tips; | |
| 274 | +} | |
| 275 | + | |
| 276 | ++ (CNLiveTips *)createTipsToView:(UIView *)view { | |
| 277 | + CNLiveTips *tips = [[CNLiveTips alloc] initWithView:view]; | |
| 278 | + [view addSubview:tips]; | |
| 279 | + tips.removeFromSuperViewWhenHide = YES; | |
| 280 | + return tips; | |
| 281 | +} | |
| 282 | + | |
| 283 | ++ (void)hideAllTipsInView:(UIView *)view { | |
| 284 | + [self hideAllToastInView:view animated:NO]; | |
| 285 | +} | |
| 286 | + | |
| 287 | ++ (void)hideAllTips { | |
| 288 | + [self hideAllToastInView:nil animated:NO]; | |
| 289 | +} | |
| 290 | + | |
| 291 | +@end | ... | ... |
CNLiveTips/Classes/CNLiveToastAnimator.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastAnimator.h | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +@class CNLiveToastView; | |
| 12 | + | |
| 13 | +NS_ASSUME_NONNULL_BEGIN | |
| 14 | + | |
| 15 | +/** | |
| 16 | + * `QMUIToastAnimatorDelegate`是所有`QMUIToastAnimator`或者其子类必须遵循的协议,是整个动画过程实现的地方。 | |
| 17 | + */ | |
| 18 | +@protocol CNliveToastAnimatorDelegate <NSObject> | |
| 19 | + | |
| 20 | +@required | |
| 21 | + | |
| 22 | +- (void)showWithCompletion:(void (^)(BOOL finished))completion; | |
| 23 | +- (void)hideWithCompletion:(void (^)(BOOL finished))completion; | |
| 24 | +- (BOOL)isShowing; | |
| 25 | +- (BOOL)isAnimating; | |
| 26 | +@end | |
| 27 | +// TODO: 实现多种animation类型 | |
| 28 | + | |
| 29 | +typedef NS_ENUM(NSInteger, CNLiveToastAnimationType) { | |
| 30 | + CNLiveToastAnimationTypeFade = 0, | |
| 31 | + CNLiveToastAnimationTypeZoom, | |
| 32 | + CNLiveToastAnimationTypeSlide | |
| 33 | +}; | |
| 34 | +/** | |
| 35 | + * `CNLiveToastAnimator`可以让你通过实现一些协议来自定义ToastView显示和隐藏的动画。你可以继承`CNLiveToastAnimator`,然后实现`CNLiveToastAnimatorDelegate`中的方法,即可实现自定义的动画。CNLiveToastAnimator默认也提供了几种type的动画:1、CNLiveToastAnimationTypeFade;2、CNLiveToastAnimationTypeZoom;3、CNLiveToastAnimationTypeSlide; | |
| 36 | + */ | |
| 37 | +@interface CNLiveToastAnimator : NSObject<CNliveToastAnimatorDelegate> | |
| 38 | +/** | |
| 39 | + * 初始化方法,请务必使用这个方法来初始化。 | |
| 40 | + * | |
| 41 | + * @param toastView 要使用这个animator的CNLiveToastView实例。 | |
| 42 | + */ | |
| 43 | + | |
| 44 | +- (instancetype)initWithToastView:(CNLiveToastView *)toastView NS_DESIGNATED_INITIALIZER; | |
| 45 | + | |
| 46 | +/** | |
| 47 | + * 获取初始化传进来的CNLiveToastView。 | |
| 48 | + */ | |
| 49 | +@property(nonatomic, weak, readonly) CNLiveToastView *toastView; | |
| 50 | + | |
| 51 | +/** | |
| 52 | + * 指定QMUIToastAnimator做动画的类型type。此功能暂时未实现,目前所有动画类型都是CNLiveToastAnimationTypeFade。 | |
| 53 | + */ | |
| 54 | +@property(nonatomic, assign) CNLiveToastAnimationType animationType; | |
| 55 | +@end | |
| 56 | + | |
| 57 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveTips/Classes/CNLiveToastAnimator.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastAnimator.m | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveToastAnimator.h" | |
| 10 | +#import <QMUIKit/QMUIKit.h> | |
| 11 | +#import "QMUICore.h" | |
| 12 | +#import "CNLiveToastView.h" | |
| 13 | + | |
| 14 | +@interface CNLiveToastAnimator () | |
| 15 | +@property(nonatomic, assign) BOOL isShowing; | |
| 16 | +@property(nonatomic, assign) BOOL isAnimating; | |
| 17 | +@end | |
| 18 | + | |
| 19 | +@implementation CNLiveToastAnimator | |
| 20 | +- (instancetype)init { | |
| 21 | + NSAssert(NO, @"请使用initWithToastView:初始化"); | |
| 22 | + return [self initWithToastView:nil]; | |
| 23 | +} | |
| 24 | + | |
| 25 | +- (instancetype)initWithCoder:(NSCoder *)coder { | |
| 26 | + NSAssert(NO, @"请使用initWithToastView:初始化"); | |
| 27 | + return [self initWithToastView:nil]; | |
| 28 | +} | |
| 29 | + | |
| 30 | +- (instancetype)initWithToastView:(CNLiveToastView *)toastView { | |
| 31 | + NSAssert(toastView, @"toastView不能为空"); | |
| 32 | + if (self = [super init]) { | |
| 33 | + _toastView = toastView; | |
| 34 | + } | |
| 35 | + return self; | |
| 36 | +} | |
| 37 | + | |
| 38 | +- (void)showWithCompletion:(void (^)(BOOL finished))completion { | |
| 39 | + self.isShowing = YES; | |
| 40 | + self.isAnimating = YES; | |
| 41 | + [UIView animateWithDuration:0.25 delay:0.0 options:QMUIViewAnimationOptionsCurveOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ | |
| 42 | + self.toastView.backgroundView.alpha = 1.0; | |
| 43 | + self.toastView.contentView.alpha = 1.0; | |
| 44 | + } completion:^(BOOL finished) { | |
| 45 | + self.isAnimating = NO; | |
| 46 | + if (completion) { | |
| 47 | + completion(finished); | |
| 48 | + } | |
| 49 | + }]; | |
| 50 | +} | |
| 51 | + | |
| 52 | +- (void)hideWithCompletion:(void (^)(BOOL finished))completion { | |
| 53 | + self.isShowing = NO; | |
| 54 | + self.isAnimating = YES; | |
| 55 | + [UIView animateWithDuration:0.25 delay:0.0 options:QMUIViewAnimationOptionsCurveOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ | |
| 56 | + self.toastView.backgroundView.alpha = 0.0; | |
| 57 | + self.toastView.contentView.alpha = 0.0; | |
| 58 | + } completion:^(BOOL finished) { | |
| 59 | + self.isAnimating = NO; | |
| 60 | + if (completion) { | |
| 61 | + completion(finished); | |
| 62 | + } | |
| 63 | + }]; | |
| 64 | +} | |
| 65 | + | |
| 66 | +- (BOOL)isShowing { | |
| 67 | + return self.isShowing; | |
| 68 | +} | |
| 69 | + | |
| 70 | +- (BOOL)isAnimating { | |
| 71 | + return self.isAnimating; | |
| 72 | +} | |
| 73 | + | |
| 74 | +@end | ... | ... |
CNLiveTips/Classes/CNLiveToastBackgroundView.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastBackgroundView.h | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveToastBackgroundView : UIView | |
| 14 | +/** | |
| 15 | + * 是否需要磨砂,默认NO。仅支持iOS8及以上版本。可以通过修改`styleColor`来控制磨砂的效果。 | |
| 16 | + */ | |
| 17 | +@property(nonatomic, assign) BOOL shouldBlurBackgroundView; | |
| 18 | + | |
| 19 | +/** | |
| 20 | + * 如果不设置磨砂,则styleColor直接作为`QMUIToastBackgroundView`的backgroundColor;如果需要磨砂,则会新增加一个`UIVisualEffectView`放在`QMUIToastBackgroundView`上面 | |
| 21 | + */ | |
| 22 | +@property(nonatomic, strong) UIColor *styleColor UI_APPEARANCE_SELECTOR; | |
| 23 | + | |
| 24 | +/** | |
| 25 | + * 设置圆角。 | |
| 26 | + */ | |
| 27 | +@property(nonatomic, assign) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; | |
| 28 | +@end | |
| 29 | + | |
| 30 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveTips/Classes/CNLiveToastBackgroundView.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastBackgroundView.m | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveToastBackgroundView.h" | |
| 10 | +#import <UIKit/UIKit.h> | |
| 11 | +#import "QMUICore.h" | |
| 12 | +@interface CNLiveToastBackgroundView () | |
| 13 | +@property(nonatomic, strong) UIView *effectView; | |
| 14 | +@end | |
| 15 | + | |
| 16 | +@implementation CNLiveToastBackgroundView | |
| 17 | + | |
| 18 | +- (instancetype)initWithFrame:(CGRect)frame { | |
| 19 | + self = [super initWithFrame:frame]; | |
| 20 | + if (self) { | |
| 21 | + self.layer.allowsGroupOpacity = NO; | |
| 22 | + self.backgroundColor = self.styleColor; | |
| 23 | + self.layer.cornerRadius = self.cornerRadius; | |
| 24 | + | |
| 25 | + } | |
| 26 | + return self; | |
| 27 | +} | |
| 28 | +- (void)setShouldBlurBackgroundView:(BOOL)shouldBlurBackgroundView { | |
| 29 | + _shouldBlurBackgroundView = shouldBlurBackgroundView; | |
| 30 | + if (shouldBlurBackgroundView) { | |
| 31 | + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; | |
| 32 | + UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect]; | |
| 33 | + effectView.layer.cornerRadius = self.cornerRadius; | |
| 34 | + effectView.layer.masksToBounds = YES; | |
| 35 | + [self addSubview:effectView]; | |
| 36 | + self.effectView = effectView; | |
| 37 | + } else { | |
| 38 | + if (self.effectView) { | |
| 39 | + [self.effectView removeFromSuperview]; | |
| 40 | + self.effectView = nil; | |
| 41 | + } | |
| 42 | + } | |
| 43 | +} | |
| 44 | + | |
| 45 | +- (void)layoutSubviews { | |
| 46 | + [super layoutSubviews]; | |
| 47 | + if (self.effectView) { | |
| 48 | + self.effectView.frame = self.bounds; | |
| 49 | + } | |
| 50 | +} | |
| 51 | + | |
| 52 | +#pragma mark - UIAppearance | |
| 53 | + | |
| 54 | +- (void)setStyleColor:(UIColor *)styleColor { | |
| 55 | + _styleColor = styleColor; | |
| 56 | + self.backgroundColor = styleColor; | |
| 57 | +} | |
| 58 | + | |
| 59 | +- (void)setCornerRadius:(CGFloat)cornerRadius { | |
| 60 | + _cornerRadius = cornerRadius; | |
| 61 | + self.layer.cornerRadius = cornerRadius; | |
| 62 | + if (self.effectView) { | |
| 63 | + self.effectView.layer.cornerRadius = cornerRadius; | |
| 64 | + } | |
| 65 | +} | |
| 66 | + | |
| 67 | +@end | |
| 68 | + | |
| 69 | + | |
| 70 | +@interface CNLiveToastBackgroundView (UIAppearance) | |
| 71 | + | |
| 72 | +@end | |
| 73 | + | |
| 74 | +@implementation CNLiveToastBackgroundView (UIAppearance) | |
| 75 | + | |
| 76 | ++ (void)initialize { | |
| 77 | + static dispatch_once_t onceToken; | |
| 78 | + dispatch_once(&onceToken, ^{ | |
| 79 | + [self setDefaultAppearance]; | |
| 80 | + }); | |
| 81 | +} | |
| 82 | + | |
| 83 | ++ (void)setDefaultAppearance { | |
| 84 | + CNLiveToastBackgroundView *appearance = [CNLiveToastBackgroundView appearance]; | |
| 85 | + appearance.styleColor = UIColorMakeWithRGBA(0, 0, 0, 0.8); | |
| 86 | + appearance.cornerRadius = 10.0; | |
| 87 | +} | |
| 88 | + | |
| 89 | +@end | ... | ... |
CNLiveTips/Classes/CNLiveToastContentView.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastContentView.h | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +/** | |
| 14 | + * `QMUIToastView`默认使用的contentView。其结构是:customView->textLabel->detailTextLabel等三个view依次往下排列。其中customView可以赋值任意的UIView或者自定义的view。 | |
| 15 | + * 注意,customView 会响应 tintColor 的变化。而 textLabel/detailTextLabel 在没设置颜色到 attributes 里的情况下,也会跟随 tintColor 变化,设置了 attributes 的颜色则优先使用 attributes 里的颜色。 | |
| 16 | + * | |
| 17 | + * @TODO: 增加多种类型的progressView的支持。 | |
| 18 | + */ | |
| 19 | +@interface CNLiveToastContentView : UIView | |
| 20 | +/** | |
| 21 | + * 设置一个UIView,可以是:菊花、图片等等,请自行保证 customView 的 size 被正确设置 | |
| 22 | + */ | |
| 23 | +@property(nonatomic, strong) UIView *customView; | |
| 24 | + | |
| 25 | +/** | |
| 26 | + * 设置第一行大文字label | |
| 27 | + */ | |
| 28 | +@property(nonatomic, strong, readonly) UILabel *textLabel; | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * 通过textLabelText设置可以应用textLabelAttributes的样式,如果通过textLabel.text设置则可能导致一些样式失效。 | |
| 32 | + */ | |
| 33 | +@property(nonatomic, copy) NSString *textLabelText; | |
| 34 | + | |
| 35 | +/** | |
| 36 | + * 设置第二行小文字label | |
| 37 | + */ | |
| 38 | +@property(nonatomic, strong, readonly) UILabel *detailTextLabel; | |
| 39 | + | |
| 40 | +/** | |
| 41 | + * 通过detailTextLabelText设置可以应用detailTextLabelAttributes的样式,如果通过detailTextLabel.text设置则可能导致一些样式失效。 | |
| 42 | + */ | |
| 43 | +@property(nonatomic, copy) NSString *detailTextLabelText; | |
| 44 | + | |
| 45 | +/** | |
| 46 | + * 设置上下左右的padding。 | |
| 47 | + */ | |
| 48 | +@property(nonatomic, assign) UIEdgeInsets insets UI_APPEARANCE_SELECTOR; | |
| 49 | + | |
| 50 | +/** | |
| 51 | + * 设置最小size。 | |
| 52 | + */ | |
| 53 | +@property(nonatomic, assign) CGSize minimumSize UI_APPEARANCE_SELECTOR; | |
| 54 | + | |
| 55 | +/** | |
| 56 | + * 设置customView的marginBottom | |
| 57 | + */ | |
| 58 | +@property(nonatomic, assign) CGFloat customViewMarginBottom UI_APPEARANCE_SELECTOR; | |
| 59 | + | |
| 60 | +/** | |
| 61 | + * 设置textLabel的marginBottom | |
| 62 | + */ | |
| 63 | +@property(nonatomic, assign) CGFloat textLabelMarginBottom UI_APPEARANCE_SELECTOR; | |
| 64 | + | |
| 65 | +/** | |
| 66 | + * 设置detailTextLabel的marginBottom | |
| 67 | + */ | |
| 68 | +@property(nonatomic, assign) CGFloat detailTextLabelMarginBottom UI_APPEARANCE_SELECTOR; | |
| 69 | + | |
| 70 | +/** | |
| 71 | + * 设置textLabel的attributes,如果包含 NSForegroundColorAttributeName 则 textLabel 不响应 tintColor,如果不包含则 textLabel 会拿 tintColor 当成文字颜色 | |
| 72 | + */ | |
| 73 | +@property(nonatomic, strong) NSDictionary <NSString *, id> *textLabelAttributes UI_APPEARANCE_SELECTOR; | |
| 74 | + | |
| 75 | +/** | |
| 76 | + * 设置 detailTextLabel 的 attributes,如果包含 NSForegroundColorAttributeName 则 detailTextLabel 不响应 tintColor,如果不包含则 detailTextLabel 会拿 tintColor 当成文字颜色 | |
| 77 | + */ | |
| 78 | +@property(nonatomic, strong) NSDictionary <NSString *, id> *detailTextLabelAttributes UI_APPEARANCE_SELECTOR; | |
| 79 | +@end | |
| 80 | + | |
| 81 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveTips/Classes/CNLiveToastContentView.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastContentView.m | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveToastContentView.h" | |
| 10 | +#import "QMUIKit.h" | |
| 11 | +#import "QMUICore.h" | |
| 12 | +#import "UIView+QMUI.h" | |
| 13 | +#import "NSParagraphStyle+QMUI.h" | |
| 14 | +@implementation CNLiveToastContentView | |
| 15 | +- (instancetype)initWithFrame:(CGRect)frame { | |
| 16 | + self = [super initWithFrame:frame]; | |
| 17 | + if (self) { | |
| 18 | + self.layer.allowsGroupOpacity = NO; | |
| 19 | + [self initSubviews]; | |
| 20 | + } | |
| 21 | + return self; | |
| 22 | +} | |
| 23 | +- (void)initSubviews { | |
| 24 | + | |
| 25 | + _textLabel = [[UILabel alloc] init]; | |
| 26 | + self.textLabel.numberOfLines = 0; | |
| 27 | + self.textLabel.opaque = NO; | |
| 28 | + [self addSubview:self.textLabel]; | |
| 29 | + | |
| 30 | + _detailTextLabel = [[UILabel alloc] init]; | |
| 31 | + self.detailTextLabel.numberOfLines = 0; | |
| 32 | + self.detailTextLabel.opaque = NO; | |
| 33 | + [self addSubview:self.detailTextLabel]; | |
| 34 | +} | |
| 35 | + | |
| 36 | +- (void)setCustomView:(UIView *)customView { | |
| 37 | + if (self.customView) { | |
| 38 | + [self.customView removeFromSuperview]; | |
| 39 | + _customView = nil; | |
| 40 | + } | |
| 41 | + _customView = customView; | |
| 42 | + [self addSubview:self.customView]; | |
| 43 | + [self updateCustomViewTintColor]; | |
| 44 | + [self setNeedsLayout]; | |
| 45 | +} | |
| 46 | + | |
| 47 | +- (void)setTextLabelText:(NSString *)textLabelText { | |
| 48 | + _textLabelText = textLabelText; | |
| 49 | + if (textLabelText) { | |
| 50 | + self.textLabel.attributedText = [[NSAttributedString alloc] initWithString:textLabelText attributes:self.textLabelAttributes]; | |
| 51 | + self.textLabel.textAlignment = NSTextAlignmentCenter; | |
| 52 | + [self setNeedsLayout]; | |
| 53 | + } | |
| 54 | +} | |
| 55 | + | |
| 56 | +- (void)setDetailTextLabelText:(NSString *)detailTextLabelText { | |
| 57 | + _detailTextLabelText = detailTextLabelText; | |
| 58 | + if (detailTextLabelText) { | |
| 59 | + self.detailTextLabel.attributedText = [[NSAttributedString alloc] initWithString:detailTextLabelText attributes:self.detailTextLabelAttributes]; | |
| 60 | + self.detailTextLabel.textAlignment = NSTextAlignmentCenter; | |
| 61 | + } | |
| 62 | +} | |
| 63 | + | |
| 64 | +- (CGSize)sizeThatFits:(CGSize)size { | |
| 65 | + return [self sizeThatFits:size shouldConsiderMinimumSize:YES]; | |
| 66 | +} | |
| 67 | + | |
| 68 | +- (CGSize)sizeThatFits:(CGSize)size shouldConsiderMinimumSize:(BOOL)shouldConsiderMinimumSize { | |
| 69 | + BOOL hasCustomView = !!self.customView; | |
| 70 | + BOOL hasTextLabel = self.textLabel.text.length > 0; | |
| 71 | + BOOL hasDetailTextLabel = self.detailTextLabel.text.length > 0; | |
| 72 | + | |
| 73 | + CGFloat width = 0; | |
| 74 | + CGFloat height = 0; | |
| 75 | + | |
| 76 | + CGFloat maxContentWidth = size.width - UIEdgeInsetsGetHorizontalValue(self.insets); | |
| 77 | + CGFloat maxContentHeight = size.height - UIEdgeInsetsGetVerticalValue(self.insets); | |
| 78 | + | |
| 79 | + if (hasCustomView) { | |
| 80 | + width = MIN(maxContentWidth, MAX(width, CGRectGetWidth(self.customView.frame))); | |
| 81 | + height += (CGRectGetHeight(self.customView.frame) + ((hasTextLabel || hasDetailTextLabel) ? self.customViewMarginBottom : 0)); | |
| 82 | + } | |
| 83 | + | |
| 84 | + if (hasTextLabel) { | |
| 85 | + CGSize textLabelSize = [self.textLabel sizeThatFits:CGSizeMake(maxContentWidth, maxContentHeight)]; | |
| 86 | + width = MIN(maxContentWidth, MAX(width, textLabelSize.width)); | |
| 87 | + height += (textLabelSize.height + (hasDetailTextLabel ? self.textLabelMarginBottom : 0)); | |
| 88 | + } | |
| 89 | + | |
| 90 | + if (hasDetailTextLabel) { | |
| 91 | + CGSize detailTextLabelSize = [self.detailTextLabel sizeThatFits:CGSizeMake(maxContentWidth, maxContentHeight)]; | |
| 92 | + width = MIN(maxContentWidth, MAX(width, detailTextLabelSize.width)); | |
| 93 | + height += (detailTextLabelSize.height + self.detailTextLabelMarginBottom); | |
| 94 | + } | |
| 95 | + | |
| 96 | + width += UIEdgeInsetsGetHorizontalValue(self.insets); | |
| 97 | + height += UIEdgeInsetsGetVerticalValue(self.insets); | |
| 98 | + | |
| 99 | + if (shouldConsiderMinimumSize) { | |
| 100 | + width = MAX(width, self.minimumSize.width); | |
| 101 | + height = MAX(height, self.minimumSize.height); | |
| 102 | + } | |
| 103 | + | |
| 104 | + return CGSizeMake(width, height); | |
| 105 | +} | |
| 106 | + | |
| 107 | +- (void)layoutSubviews { | |
| 108 | + [super layoutSubviews]; | |
| 109 | + | |
| 110 | + BOOL hasCustomView = !!self.customView; | |
| 111 | + BOOL hasTextLabel = self.textLabel.text.length > 0; | |
| 112 | + BOOL hasDetailTextLabel = self.detailTextLabel.text.length > 0; | |
| 113 | + | |
| 114 | + CGFloat contentLimitWidth = self.qmui_width - UIEdgeInsetsGetHorizontalValue(self.insets); | |
| 115 | + CGSize contentSize = [self sizeThatFits:self.bounds.size shouldConsiderMinimumSize:NO]; | |
| 116 | + CGFloat minY = self.insets.top + CGFloatGetCenter(self.qmui_height - UIEdgeInsetsGetVerticalValue(self.insets), contentSize.height - UIEdgeInsetsGetVerticalValue(self.insets)); | |
| 117 | + if (hasCustomView) { | |
| 118 | + self.customView.qmui_left = self.insets.left + CGFloatGetCenter(contentLimitWidth, self.customView.qmui_width); | |
| 119 | + self.customView.qmui_top = minY; | |
| 120 | + minY = self.customView.qmui_bottom + self.customViewMarginBottom; | |
| 121 | + } | |
| 122 | + if (hasTextLabel) { | |
| 123 | + CGSize textLabelSize = [self.textLabel sizeThatFits:CGSizeMake(contentLimitWidth, CGFLOAT_MAX)]; | |
| 124 | + self.textLabel.qmui_left = self.insets.left; | |
| 125 | + self.textLabel.qmui_top = minY; | |
| 126 | + self.textLabel.qmui_width = contentLimitWidth; | |
| 127 | + self.textLabel.qmui_height = textLabelSize.height; | |
| 128 | + minY = self.textLabel.qmui_bottom + self.textLabelMarginBottom; | |
| 129 | + } | |
| 130 | + if (hasDetailTextLabel) { | |
| 131 | + CGSize detailTextLabelSize = [self.detailTextLabel sizeThatFits:CGSizeMake(contentLimitWidth, CGFLOAT_MAX)]; | |
| 132 | + self.detailTextLabel.qmui_left = self.insets.left; | |
| 133 | + self.detailTextLabel.qmui_top = minY; | |
| 134 | + self.detailTextLabel.qmui_width = contentLimitWidth; | |
| 135 | + self.detailTextLabel.qmui_height = detailTextLabelSize.height; | |
| 136 | + } | |
| 137 | +} | |
| 138 | + | |
| 139 | +- (void)tintColorDidChange { | |
| 140 | + [super tintColorDidChange]; | |
| 141 | + | |
| 142 | + if (self.customView) { | |
| 143 | + [self updateCustomViewTintColor]; | |
| 144 | + } | |
| 145 | + | |
| 146 | + // 如果通过 attributes 设置了文字颜色,则不再响应 tintColor | |
| 147 | + if (!self.textLabelAttributes[NSForegroundColorAttributeName]) { | |
| 148 | + self.textLabel.textColor = self.tintColor; | |
| 149 | + } | |
| 150 | + | |
| 151 | + if (!self.detailTextLabelAttributes[NSForegroundColorAttributeName]) { | |
| 152 | + self.detailTextLabel.textColor = self.tintColor; | |
| 153 | + } | |
| 154 | +} | |
| 155 | + | |
| 156 | +- (void)updateCustomViewTintColor { | |
| 157 | + if (!self.customView) { | |
| 158 | + return; | |
| 159 | + } | |
| 160 | + self.customView.tintColor = self.tintColor; | |
| 161 | + if ([self.customView isKindOfClass:[UIActivityIndicatorView class]]) { | |
| 162 | + UIActivityIndicatorView *customView = (UIActivityIndicatorView *)self.customView; | |
| 163 | + customView.color = self.tintColor; | |
| 164 | + } | |
| 165 | +} | |
| 166 | + | |
| 167 | +#pragma mark - UIAppearance | |
| 168 | + | |
| 169 | +- (void)setInsets:(UIEdgeInsets)insets { | |
| 170 | + _insets = insets; | |
| 171 | + [self setNeedsLayout]; | |
| 172 | +} | |
| 173 | + | |
| 174 | +- (void)setMinimumSize:(CGSize)minimumSize { | |
| 175 | + _minimumSize = minimumSize; | |
| 176 | + [self setNeedsLayout]; | |
| 177 | +} | |
| 178 | + | |
| 179 | +- (void)setCustomViewMarginBottom:(CGFloat)customViewMarginBottom { | |
| 180 | + _customViewMarginBottom = customViewMarginBottom; | |
| 181 | + [self setNeedsLayout]; | |
| 182 | +} | |
| 183 | + | |
| 184 | +- (void)setTextLabelMarginBottom:(CGFloat)textLabelMarginBottom { | |
| 185 | + _textLabelMarginBottom = textLabelMarginBottom; | |
| 186 | + [self setNeedsLayout]; | |
| 187 | +} | |
| 188 | + | |
| 189 | +- (void)setDetailTextLabelMarginBottom:(CGFloat)detailTextLabelMarginBottom { | |
| 190 | + _detailTextLabelMarginBottom = detailTextLabelMarginBottom; | |
| 191 | + [self setNeedsLayout]; | |
| 192 | +} | |
| 193 | + | |
| 194 | +- (void)setTextLabelAttributes:(NSDictionary *)textLabelAttributes { | |
| 195 | + _textLabelAttributes = textLabelAttributes; | |
| 196 | + if (self.textLabelText && self.textLabelText.length > 0) { | |
| 197 | + // 刷新label的attributes | |
| 198 | + self.textLabelText = self.textLabelText; | |
| 199 | + } | |
| 200 | +} | |
| 201 | + | |
| 202 | +- (void)setDetailTextLabelAttributes:(NSDictionary *)detailTextLabelAttributes { | |
| 203 | + _detailTextLabelAttributes = detailTextLabelAttributes; | |
| 204 | + if (self.detailTextLabelText && self.detailTextLabelText.length > 0) { | |
| 205 | + // 刷新label的attributes | |
| 206 | + self.detailTextLabelText = self.detailTextLabelText; | |
| 207 | + } | |
| 208 | +} | |
| 209 | + | |
| 210 | +@end | |
| 211 | + | |
| 212 | + | |
| 213 | +@interface CNLiveToastContentView (UIAppearance) | |
| 214 | + | |
| 215 | +@end | |
| 216 | + | |
| 217 | +@implementation CNLiveToastContentView (UIAppearance) | |
| 218 | + | |
| 219 | ++ (void)initialize { | |
| 220 | + static dispatch_once_t onceToken; | |
| 221 | + dispatch_once(&onceToken, ^{ | |
| 222 | + [self setDefaultAppearance]; | |
| 223 | + }); | |
| 224 | +} | |
| 225 | + | |
| 226 | ++ (void)setDefaultAppearance { | |
| 227 | + CNLiveToastContentView *appearance = [CNLiveToastContentView appearance]; | |
| 228 | + appearance.insets = UIEdgeInsetsMake(16, 16, 16, 16); | |
| 229 | + appearance.minimumSize = CGSizeZero; | |
| 230 | + appearance.customViewMarginBottom = 8; | |
| 231 | + appearance.textLabelMarginBottom = 4; | |
| 232 | + appearance.detailTextLabelMarginBottom = 0; | |
| 233 | + appearance.textLabelAttributes = @{NSFontAttributeName: UIFontBoldMake(16), NSParagraphStyleAttributeName: [NSMutableParagraphStyle qmui_paragraphStyleWithLineHeight:22 lineBreakMode:NSLineBreakByWordWrapping textAlignment:NSTextAlignmentCenter]}; | |
| 234 | + appearance.detailTextLabelAttributes = @{NSFontAttributeName: UIFontBoldMake(12), NSParagraphStyleAttributeName: [NSMutableParagraphStyle qmui_paragraphStyleWithLineHeight:18 lineBreakMode:NSLineBreakByWordWrapping textAlignment:NSTextAlignmentCenter]}; | |
| 235 | +} | |
| 236 | + | |
| 237 | +@end | ... | ... |
CNLiveTips/Classes/CNLiveToastView.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastView.h | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <UIKit/UIKit.h> | |
| 10 | +@class CNLiveToastAnimator; | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +typedef NS_ENUM(NSInteger, CNLiveToastViewPosition) { | |
| 14 | + CNLiveToastViewPositionTop, | |
| 15 | + CNLiveToastViewPositionCenter, | |
| 16 | + CNLiveToastViewPositionBottom | |
| 17 | +}; | |
| 18 | + | |
| 19 | +/** | |
| 20 | + * `QMUIToastView`是一个用来显示toast的控件,其主要结构包括:`backgroundView`、`contentView`,这两个view都是通过外部赋值获取,默认使用`QMUIToastBackgroundView`和`QMUIToastContentView`。 | |
| 21 | + * | |
| 22 | + * 拓展性:`QMUIToastBackgroundView`和`QMUIToastContentView`是QMUI提供的默认的view,这两个view都可以通过appearance来修改样式,如果这两个view满足不了需求,那么也可以通过新建自定义的view来代替这两个view。另外,QMUI也提供了默认的toastAnimator来实现ToastView的显示和隐藏动画,如果需要重新定义一套动画,可以继承`QMUIToastAnimator`并且实现`QMUIToastAnimatorDelegate`中的协议就可以自定义自己的一套动画。 | |
| 23 | + * | |
| 24 | + * 样式自定义:建议通过 tintColor 统一修改整个 toastView 的内容样式。当然你也可以单独修改 contentView.tintColor。默认情况下 QMUIToastView.tintColor = UIColorWhite。 | |
| 25 | + * | |
| 26 | + * 建议使用`QMUIToastView`的时候,再封装一层,具体可以参考`QMUITips`这个类。 | |
| 27 | + * | |
| 28 | + * @see QMUIToastBackgroundView | |
| 29 | + * @see QMUIToastContentView | |
| 30 | + * @see QMUIToastAnimator | |
| 31 | + * @see QMUITips | |
| 32 | + */ | |
| 33 | +@interface CNLiveToastView : UIView | |
| 34 | +/** | |
| 35 | + * 生成一个ToastView的唯一初始化方法,`view`的bound将会作为ToastView默认frame。 | |
| 36 | + * | |
| 37 | + * @param view ToastView的superView。 | |
| 38 | + */ | |
| 39 | +- (nonnull instancetype)initWithView:(nonnull UIView *)view NS_DESIGNATED_INITIALIZER; | |
| 40 | + | |
| 41 | +/** | |
| 42 | + * parentView是ToastView初始化的时候传进去的那个view。 | |
| 43 | + */ | |
| 44 | +@property(nonatomic, weak, readonly) UIView *parentView; | |
| 45 | + | |
| 46 | +/** | |
| 47 | + * 显示ToastView。 | |
| 48 | + * | |
| 49 | + * @param animated 是否需要通过动画显示。 | |
| 50 | + * | |
| 51 | + * @see toastAnimator | |
| 52 | + */ | |
| 53 | +- (void)showAnimated:(BOOL)animated; | |
| 54 | + | |
| 55 | +/** | |
| 56 | + * 隐藏ToastView。 | |
| 57 | + * | |
| 58 | + * @param animated 是否需要通过动画隐藏。 | |
| 59 | + * | |
| 60 | + * @see toastAnimator | |
| 61 | + */ | |
| 62 | +- (void)hideAnimated:(BOOL)animated; | |
| 63 | + | |
| 64 | +/** | |
| 65 | + * 在`delay`时间后隐藏ToastView。 | |
| 66 | + * | |
| 67 | + * @param animated 是否需要通过动画隐藏。 | |
| 68 | + * @param delay 多少秒后隐藏。 | |
| 69 | + * | |
| 70 | + * @see toastAnimator | |
| 71 | + */ | |
| 72 | +- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; | |
| 73 | + | |
| 74 | +/// @warning 如果使用 [QMUITips showXxx] 系列快捷方法来显示 tips,willShowBlock 将会在 show 之后才被设置,最终并不会被调用。这种场景建议自己在调用 [QMUITips showXxx] 之前执行一段代码,或者不要使用 [QMUITips showXxx] 的方式显示 tips | |
| 75 | +@property(nonatomic, copy) void (^willShowBlock)(UIView *showInView, BOOL animated); | |
| 76 | +@property(nonatomic, copy) void (^didShowBlock)(UIView *showInView, BOOL animated); | |
| 77 | +@property(nonatomic, copy) void (^willHideBlock)(UIView *hideInView, BOOL animated); | |
| 78 | +@property(nonatomic, copy) void (^didHideBlock)(UIView *hideInView, BOOL animated); | |
| 79 | + | |
| 80 | +/** | |
| 81 | + * `QMUIToastAnimator`可以让你通过实现一些协议来自定义ToastView显示和隐藏的动画。你可以继承`QMUIToastAnimator`,然后实现`QMUIToastAnimatorDelegate`中的方法,即可实现自定义的动画。如果不赋值,则会使用`QMUIToastAnimator`中的默认动画。 | |
| 82 | + */ | |
| 83 | +@property(nonatomic, strong)CNLiveToastAnimator *toastAnimator; | |
| 84 | + | |
| 85 | +/** | |
| 86 | + * 决定QMUIToastView的位置,目前有上中下三个位置,默认值是center。 | |
| 87 | + | |
| 88 | + * 如果设置了top或者bottom,那么ToastView的布局规则是:顶部从marginInsets.top开始往下布局(QMUIToastViewPositionTop) 和 底部从marginInsets.bottom开始往上布局(QMUIToastViewPositionBottom)。 | |
| 89 | + */ | |
| 90 | +@property(nonatomic, assign) CNLiveToastViewPosition toastPosition; | |
| 91 | + | |
| 92 | +/** | |
| 93 | + * 是否在ToastView隐藏的时候顺便把它从superView移除,默认为NO。 | |
| 94 | + */ | |
| 95 | +@property(nonatomic, assign) BOOL removeFromSuperViewWhenHide; | |
| 96 | + | |
| 97 | + | |
| 98 | +/////////////////// | |
| 99 | + | |
| 100 | + | |
| 101 | +/** | |
| 102 | + * 会盖住整个superView,防止手指可以点击到ToastView下面的内容,默认透明。 | |
| 103 | + */ | |
| 104 | +@property(nonatomic, strong, readonly) UIView *maskView; | |
| 105 | + | |
| 106 | +/**s | |
| 107 | + * 承载Toast内容的UIView,可以自定义并赋值给contentView。如果contentView需要跟随ToastView的tintColor变化而变化,可以重写自定义view的`tintColorDidChange`来实现。默认使用`QMUIToastContentView`实现。 | |
| 108 | + */ | |
| 109 | +@property(nonatomic, strong) __kindof UIView *contentView; | |
| 110 | + | |
| 111 | +/** | |
| 112 | + * `contentView`下面的黑色背景UIView,默认使用`QMUIToastBackgroundView`实现,可以通过`QMUIToastBackgroundView`的 cornerRadius 和 styleColor 来修改圆角和背景色。 | |
| 113 | + */ | |
| 114 | +@property(nonatomic, strong) __kindof UIView *backgroundView; | |
| 115 | + | |
| 116 | + | |
| 117 | +/////////////////// | |
| 118 | + | |
| 119 | + | |
| 120 | +/** | |
| 121 | + * 上下左右的偏移值。 | |
| 122 | + */ | |
| 123 | +@property(nonatomic, assign) CGPoint offset UI_APPEARANCE_SELECTOR; | |
| 124 | + | |
| 125 | +/** | |
| 126 | + * ToastView 距离 parentView 去除 safeAreaInsets 后的区域的上下左右间距。 | |
| 127 | + * | |
| 128 | + * 例如当 marginInsets.top = 0 且 toastPosition 为 QMUIToastViewPositionTop 时,如果 parentView 是 viewController.view,则 tips 顶边缘将会紧贴 navigationBar 的底边缘。而如果 parentView 是 navigationController.view,则 tips 顶边缘将会紧贴 statusBar 的底边缘。 | |
| 129 | + */ | |
| 130 | +@property(nonatomic, assign) UIEdgeInsets marginInsets UI_APPEARANCE_SELECTOR; | |
| 131 | + | |
| 132 | +@end | |
| 133 | + | |
| 134 | + | |
| 135 | +@interface CNLiveToastView (ToastTool) | |
| 136 | + | |
| 137 | +/** | |
| 138 | + * 工具方法。隐藏`view`里面的所有 ToastView | |
| 139 | + * | |
| 140 | + * @param view 即将隐藏的 ToastView 的 superView,如果 view = nil 则移除所有内存中的 ToastView | |
| 141 | + * @param animated 是否需要通过动画隐藏。 | |
| 142 | + * | |
| 143 | + * @return 如果成功隐藏一个 ToastView 则返回 YES,失败则 NO | |
| 144 | + */ | |
| 145 | ++ (BOOL)hideAllToastInView:(UIView *)view animated:(BOOL)animated; | |
| 146 | + | |
| 147 | +/** | |
| 148 | + * 工具方法。返回`view`里面最顶部的 ToastView | |
| 149 | + * | |
| 150 | + * @param view ToastView 的 superView | |
| 151 | + * @return 返回一个 QMUIToastView 的实例 | |
| 152 | + */ | |
| 153 | ++ (nullable __kindof UIView *)toastInView:(UIView *)view; | |
| 154 | + | |
| 155 | +/** | |
| 156 | + * 工具方法。返回`view`里面所有的 ToastView | |
| 157 | + * | |
| 158 | + * @param view ToastView 的 superView | |
| 159 | + * @return 包含所有 view 里面的所有 QMUIToastView,如果 view = nil 则返回所有内存中的 ToastView | |
| 160 | + */ | |
| 161 | ++ (nullable NSArray <CNLiveToastView *> *)allToastInView:(UIView *)view; | |
| 162 | +@end | |
| 163 | + | |
| 164 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveTips/Classes/CNLiveToastView.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveToastView.m | |
| 3 | +// CNLiveNetAdd | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 2018/12/24. | |
| 6 | +// Copyright © 2018年 cnlive. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveToastView.h" | |
| 10 | +#import <QMUIKit/QMUIKit.h> | |
| 11 | +#import "QMUICore.h" | |
| 12 | +#import "CNLiveToastAnimator.h" | |
| 13 | +#import "CNLiveToastContentView.h" | |
| 14 | +#import "CNLiveToastBackgroundView.h" | |
| 15 | +#import "QMUIKeyboardManager.h" | |
| 16 | +#import "UIView+QMUI.h" | |
| 17 | +static NSMutableArray <CNLiveToastView *> *kToastViews = nil; | |
| 18 | + | |
| 19 | +@interface CNLiveToastView () | |
| 20 | +@property(nonatomic, weak) NSTimer *hideDelayTimer; | |
| 21 | +@end | |
| 22 | + | |
| 23 | +@implementation CNLiveToastView | |
| 24 | + | |
| 25 | +#pragma mark - 初始化 | |
| 26 | + | |
| 27 | +- (instancetype)initWithFrame:(CGRect)frame { | |
| 28 | + NSAssert(NO, @"请使用initWithView:初始化"); | |
| 29 | + return [self initWithView:[[UIView alloc] init]]; | |
| 30 | +} | |
| 31 | + | |
| 32 | +- (instancetype)initWithCoder:(NSCoder *)aDecoder { | |
| 33 | + NSAssert(NO, @"请使用initWithView:初始化"); | |
| 34 | + return [self initWithView:[[UIView alloc] init]]; | |
| 35 | +} | |
| 36 | + | |
| 37 | +- (nonnull instancetype)initWithView:(nonnull UIView *)view { | |
| 38 | + NSAssert(view, @"view不能为空"); | |
| 39 | + if (self = [super initWithFrame:view.bounds]) { | |
| 40 | + _parentView = view; | |
| 41 | + [self didInitialize]; | |
| 42 | + } | |
| 43 | + return self; | |
| 44 | +} | |
| 45 | + | |
| 46 | +- (void)dealloc { | |
| 47 | + [self removeNotifications]; | |
| 48 | + if ([kToastViews containsObject:self]) { | |
| 49 | + [kToastViews removeObject:self]; | |
| 50 | + } | |
| 51 | +} | |
| 52 | + | |
| 53 | +- (void)didInitialize { | |
| 54 | + | |
| 55 | + self.tintColor = UIColorWhite; | |
| 56 | + | |
| 57 | + self.toastPosition =CNLiveToastViewPositionCenter; | |
| 58 | + | |
| 59 | + // 顺序不能乱,先添加backgroundView再添加contentView | |
| 60 | + self.backgroundView = [self defaultBackgrondView]; | |
| 61 | + self.contentView = [self defaultContentView]; | |
| 62 | + | |
| 63 | + self.opaque = NO; | |
| 64 | + self.alpha = 0.0; | |
| 65 | + self.backgroundColor = UIColorClear; | |
| 66 | + self.layer.allowsGroupOpacity = NO; | |
| 67 | + | |
| 68 | + _maskView = [[UIView alloc] init]; | |
| 69 | + self.maskView.backgroundColor = UIColorClear; | |
| 70 | + [self addSubview:self.maskView]; | |
| 71 | + | |
| 72 | + [self registerNotifications]; | |
| 73 | +} | |
| 74 | + | |
| 75 | +- (void)didMoveToSuperview { | |
| 76 | + if (!kToastViews) { | |
| 77 | + kToastViews = [[NSMutableArray alloc] init]; | |
| 78 | + } | |
| 79 | + if (self.superview) { | |
| 80 | + // show | |
| 81 | + if (![kToastViews containsObject:self]) { | |
| 82 | + [kToastViews addObject:self]; | |
| 83 | + } | |
| 84 | + } else { | |
| 85 | + // hide | |
| 86 | + if ([kToastViews containsObject:self]) { | |
| 87 | + [kToastViews removeObject:self]; | |
| 88 | + } | |
| 89 | + } | |
| 90 | +} | |
| 91 | + | |
| 92 | +- (void)removeFromSuperview { | |
| 93 | + [super removeFromSuperview]; | |
| 94 | + _parentView = nil; | |
| 95 | +} | |
| 96 | + | |
| 97 | +- (CNLiveToastAnimator *)defaultAnimator { | |
| 98 | + CNLiveToastAnimator *toastAnimator = [[CNLiveToastAnimator alloc] initWithToastView:self]; | |
| 99 | + return toastAnimator; | |
| 100 | +} | |
| 101 | + | |
| 102 | +- (UIView *)defaultBackgrondView { | |
| 103 | + CNLiveToastBackgroundView *backgroundView = [[CNLiveToastBackgroundView alloc] init]; | |
| 104 | + return backgroundView; | |
| 105 | +} | |
| 106 | + | |
| 107 | +- (UIView *)defaultContentView { | |
| 108 | + CNLiveToastContentView *contentView = [[CNLiveToastContentView alloc] init]; | |
| 109 | + return contentView; | |
| 110 | +} | |
| 111 | + | |
| 112 | +- (void)setBackgroundView:(UIView *)backgroundView { | |
| 113 | + if (self.backgroundView) { | |
| 114 | + [self.backgroundView removeFromSuperview]; | |
| 115 | + _backgroundView = nil; | |
| 116 | + } | |
| 117 | + _backgroundView = backgroundView; | |
| 118 | + self.backgroundView.alpha = 0.0; | |
| 119 | + [self addSubview:self.backgroundView]; | |
| 120 | + [self setNeedsLayout]; | |
| 121 | +} | |
| 122 | + | |
| 123 | +- (void)setContentView:(UIView *)contentView { | |
| 124 | + if (self.contentView) { | |
| 125 | + [self.contentView removeFromSuperview]; | |
| 126 | + _contentView = nil; | |
| 127 | + } | |
| 128 | + _contentView = contentView; | |
| 129 | + self.contentView.alpha = 0.0; | |
| 130 | + [self addSubview:self.contentView]; | |
| 131 | + [self setNeedsLayout]; | |
| 132 | +} | |
| 133 | + | |
| 134 | +- (void)layoutSubviews { | |
| 135 | + [super layoutSubviews]; | |
| 136 | + | |
| 137 | + self.frame = self.parentView.bounds; | |
| 138 | + self.maskView.frame = self.bounds; | |
| 139 | + | |
| 140 | + CGFloat contentWidth = CGRectGetWidth(self.parentView.bounds); | |
| 141 | + CGFloat contentHeight = CGRectGetHeight(self.parentView.bounds); | |
| 142 | + | |
| 143 | + UIEdgeInsets marginInsets = UIEdgeInsetsConcat(self.marginInsets, self.parentView.qmui_safeAreaInsets); | |
| 144 | + | |
| 145 | + CGFloat limitWidth = contentWidth - UIEdgeInsetsGetHorizontalValue(marginInsets); | |
| 146 | + CGFloat limitHeight = contentHeight - UIEdgeInsetsGetVerticalValue(marginInsets); | |
| 147 | + | |
| 148 | + if ([QMUIKeyboardManager isKeyboardVisible]) { | |
| 149 | + // 处理键盘相关逻辑,当键盘在显示的时候,内容高度会减去键盘的高度以使 Toast 居中 | |
| 150 | + CGRect keyboardFrame = [QMUIKeyboardManager currentKeyboardFrame]; | |
| 151 | + CGRect parentViewRect = [[QMUIKeyboardManager keyboardWindow] convertRect:self.parentView.frame fromView:self.parentView.superview]; | |
| 152 | + CGRect intersectionRect = CGRectIntersection(keyboardFrame, parentViewRect); | |
| 153 | + CGRect overlapRect = CGRectIsValidated(intersectionRect) ? CGRectFlatted(intersectionRect) : CGRectZero; | |
| 154 | + contentHeight -= CGRectGetHeight(overlapRect); | |
| 155 | + } | |
| 156 | + | |
| 157 | + if (self.contentView) { | |
| 158 | + | |
| 159 | + CGSize contentViewSize = [self.contentView sizeThatFits:CGSizeMake(limitWidth, limitHeight)]; | |
| 160 | + contentViewSize.width = MIN(contentViewSize.width, limitWidth); | |
| 161 | + contentViewSize.height = MIN(contentViewSize.height, limitHeight); | |
| 162 | + CGFloat contentViewX = MAX(marginInsets.left, (contentWidth - contentViewSize.width) / 2) + self.offset.x; | |
| 163 | + CGFloat contentViewY = MAX(marginInsets.top, (contentHeight - contentViewSize.height) / 2) + self.offset.y; | |
| 164 | + | |
| 165 | + if (self.toastPosition == CNLiveToastViewPositionTop) { | |
| 166 | + contentViewY = marginInsets.top + self.offset.y; | |
| 167 | + } else if (self.toastPosition == CNLiveToastViewPositionBottom) { | |
| 168 | + contentViewY = contentHeight - contentViewSize.height - marginInsets.bottom + self.offset.y; | |
| 169 | + } | |
| 170 | + | |
| 171 | + CGRect contentRect = CGRectFlatMake(contentViewX, contentViewY, contentViewSize.width, contentViewSize.height); | |
| 172 | + self.contentView.qmui_frameApplyTransform = contentRect; | |
| 173 | + } | |
| 174 | + if (self.backgroundView) { | |
| 175 | + // backgroundView的frame跟contentView一样,contentView里面的subviews如果需要在视觉上跟backgroundView有个padding,那么就自己在自定义的contentView里面做。 | |
| 176 | + self.backgroundView.frame = self.contentView.frame; | |
| 177 | + } | |
| 178 | +} | |
| 179 | + | |
| 180 | +#pragma mark - 横竖屏 | |
| 181 | + | |
| 182 | +- (void)registerNotifications { | |
| 183 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarOrientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; | |
| 184 | +} | |
| 185 | + | |
| 186 | +- (void)removeNotifications { | |
| 187 | + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; | |
| 188 | +} | |
| 189 | + | |
| 190 | +- (void)statusBarOrientationDidChange:(NSNotification *)notification { | |
| 191 | + if (!self.parentView) { | |
| 192 | + return; | |
| 193 | + } | |
| 194 | + [self setNeedsLayout]; | |
| 195 | + [self layoutIfNeeded]; | |
| 196 | +} | |
| 197 | + | |
| 198 | +#pragma mark - Show and Hide | |
| 199 | + | |
| 200 | +- (void)showAnimated:(BOOL)animated { | |
| 201 | + | |
| 202 | + // show之前需要layout以下,防止同一个tip切换不同的状态导致layout没更新 | |
| 203 | + [self setNeedsLayout]; | |
| 204 | + | |
| 205 | + [self.hideDelayTimer invalidate]; | |
| 206 | + self.alpha = 1.0; | |
| 207 | + | |
| 208 | + if (self.willShowBlock) { | |
| 209 | + self.willShowBlock(self.parentView, animated); | |
| 210 | + } | |
| 211 | + | |
| 212 | + if (animated) { | |
| 213 | + if (!self.toastAnimator) { | |
| 214 | + self.toastAnimator = [self defaultAnimator]; | |
| 215 | + } | |
| 216 | + if (self.toastAnimator) { | |
| 217 | + __weak __typeof(self)weakSelf = self; | |
| 218 | + [self.toastAnimator showWithCompletion:^(BOOL finished) { | |
| 219 | + if (weakSelf.didShowBlock) { | |
| 220 | + weakSelf.didShowBlock(weakSelf.parentView, animated); | |
| 221 | + } | |
| 222 | + }]; | |
| 223 | + } | |
| 224 | + } else { | |
| 225 | + self.backgroundView.alpha = 1.0; | |
| 226 | + self.contentView.alpha = 1.0; | |
| 227 | + if (self.didShowBlock) { | |
| 228 | + self.didShowBlock(self.parentView, animated); | |
| 229 | + } | |
| 230 | + } | |
| 231 | +} | |
| 232 | + | |
| 233 | +- (void)hideAnimated:(BOOL)animated { | |
| 234 | + if (self.willHideBlock) { | |
| 235 | + self.willHideBlock(self.parentView, animated); | |
| 236 | + } | |
| 237 | + if (animated) { | |
| 238 | + if (!self.toastAnimator) { | |
| 239 | + self.toastAnimator = [self defaultAnimator]; | |
| 240 | + } | |
| 241 | + if (self.toastAnimator) { | |
| 242 | + __weak __typeof(self)weakSelf = self; | |
| 243 | + [self.toastAnimator hideWithCompletion:^(BOOL finished) { | |
| 244 | + [weakSelf didHideWithAnimated:animated]; | |
| 245 | + }]; | |
| 246 | + } | |
| 247 | + } else { | |
| 248 | + self.backgroundView.alpha = 0.0; | |
| 249 | + self.contentView.alpha = 0.0; | |
| 250 | + [self didHideWithAnimated:animated]; | |
| 251 | + } | |
| 252 | +} | |
| 253 | + | |
| 254 | +- (void)didHideWithAnimated:(BOOL)animated { | |
| 255 | + | |
| 256 | + if (self.didHideBlock) { | |
| 257 | + self.didHideBlock(self.parentView, animated); | |
| 258 | + } | |
| 259 | + | |
| 260 | + [self.hideDelayTimer invalidate]; | |
| 261 | + | |
| 262 | + self.alpha = 0.0; | |
| 263 | + if (self.removeFromSuperViewWhenHide) { | |
| 264 | + [self removeFromSuperview]; | |
| 265 | + } | |
| 266 | +} | |
| 267 | + | |
| 268 | +- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay { | |
| 269 | + NSTimer *timer = [NSTimer timerWithTimeInterval:delay target:self selector:@selector(handleHideTimer:) userInfo:@(animated) repeats:NO]; | |
| 270 | + [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; | |
| 271 | + self.hideDelayTimer = timer; | |
| 272 | +} | |
| 273 | + | |
| 274 | +- (void)handleHideTimer:(NSTimer *)timer { | |
| 275 | + [self hideAnimated:[timer.userInfo boolValue]]; | |
| 276 | +} | |
| 277 | + | |
| 278 | +#pragma mark - UIAppearance | |
| 279 | + | |
| 280 | +- (void)setOffset:(CGPoint)offset { | |
| 281 | + _offset = offset; | |
| 282 | + [self setNeedsLayout]; | |
| 283 | +} | |
| 284 | + | |
| 285 | +- (void)setMarginInsets:(UIEdgeInsets)marginInsets { | |
| 286 | + _marginInsets = marginInsets; | |
| 287 | + [self setNeedsLayout]; | |
| 288 | +} | |
| 289 | + | |
| 290 | +@end | |
| 291 | + | |
| 292 | + | |
| 293 | +@interface CNLiveToastView (UIAppearance) | |
| 294 | + | |
| 295 | +@end | |
| 296 | + | |
| 297 | +@implementation CNLiveToastView (UIAppearance) | |
| 298 | + | |
| 299 | ++ (void)initialize { | |
| 300 | + static dispatch_once_t onceToken; | |
| 301 | + dispatch_once(&onceToken, ^{ | |
| 302 | + [self setDefaultAppearance]; | |
| 303 | + }); | |
| 304 | +} | |
| 305 | + | |
| 306 | ++ (void)setDefaultAppearance { | |
| 307 | + CNLiveToastView *appearance = [CNLiveToastView appearance]; | |
| 308 | + appearance.offset = CGPointZero; | |
| 309 | + appearance.marginInsets = UIEdgeInsetsMake(20, 20, 20, 20); | |
| 310 | +} | |
| 311 | + | |
| 312 | +@end | |
| 313 | + | |
| 314 | +@implementation CNLiveToastView (ToastTool) | |
| 315 | + | |
| 316 | ++ (BOOL)hideAllToastInView:(UIView *)view animated:(BOOL)animated { | |
| 317 | + NSArray *toastViews = [self allToastInView:view]; | |
| 318 | + BOOL result = NO; | |
| 319 | + for (CNLiveToastView *toastView in toastViews) { | |
| 320 | + result = YES; | |
| 321 | + toastView.removeFromSuperViewWhenHide = YES; | |
| 322 | + [toastView hideAnimated:animated]; | |
| 323 | + } | |
| 324 | + return result; | |
| 325 | +} | |
| 326 | + | |
| 327 | ++ (nullable __kindof UIView *)toastInView:(UIView *)view { | |
| 328 | + if (kToastViews.count <= 0) { | |
| 329 | + return nil; | |
| 330 | + } | |
| 331 | + UIView *toastView = kToastViews.lastObject; | |
| 332 | + if ([toastView isKindOfClass:self]) { | |
| 333 | + return toastView; | |
| 334 | + } | |
| 335 | + return nil; | |
| 336 | +} | |
| 337 | + | |
| 338 | ++ (nullable NSArray <CNLiveToastView *> *)allToastInView:(UIView *)view { | |
| 339 | + if (!view) { | |
| 340 | + return kToastViews.count > 0 ? [kToastViews mutableCopy] : nil; | |
| 341 | + } | |
| 342 | + NSMutableArray *toastViews = [[NSMutableArray alloc] init]; | |
| 343 | + for (UIView *toastView in kToastViews) { | |
| 344 | + if (toastView.superview == view && [toastView isKindOfClass:self]) { | |
| 345 | + [toastViews addObject:toastView]; | |
| 346 | + } | |
| 347 | + } | |
| 348 | + return toastViews.count > 0 ? [toastViews mutableCopy] : nil; | |
| 349 | +} | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | +@end | ... | ... |
Example/CNLiveTips.xcodeproj/project.pbxproj
0 → 100644
| 1 | +// !$*UTF8*$! | |
| 2 | +{ | |
| 3 | + archiveVersion = 1; | |
| 4 | + classes = { | |
| 5 | + }; | |
| 6 | + objectVersion = 46; | |
| 7 | + objects = { | |
| 8 | + | |
| 9 | +/* Begin PBXBuildFile section */ | |
| 10 | + 4DB2A92BA3B7E6063A7B2C55 /* Pods_CNLiveTips_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1AA0E495CA19DDB96E886B3 /* Pods_CNLiveTips_Example.framework */; }; | |
| 11 | + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; | |
| 12 | + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; | |
| 13 | + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; | |
| 14 | + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; | |
| 15 | + 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; | |
| 16 | + 6003F59E195388D20070C39A /* CNLiveAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* CNLiveAppDelegate.m */; }; | |
| 17 | + 6003F5A7195388D20070C39A /* CNLiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* CNLiveViewController.m */; }; | |
| 18 | + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; | |
| 19 | + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; | |
| 20 | + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; | |
| 21 | + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; | |
| 22 | + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; | |
| 23 | + 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; | |
| 24 | + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; | |
| 25 | + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; | |
| 26 | + B54328BFB8875FDB13113019 /* Pods_CNLiveTips_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABF3A445D726DBBD6536765F /* Pods_CNLiveTips_Tests.framework */; }; | |
| 27 | +/* End PBXBuildFile section */ | |
| 28 | + | |
| 29 | +/* Begin PBXContainerItemProxy section */ | |
| 30 | + 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { | |
| 31 | + isa = PBXContainerItemProxy; | |
| 32 | + containerPortal = 6003F582195388D10070C39A /* Project object */; | |
| 33 | + proxyType = 1; | |
| 34 | + remoteGlobalIDString = 6003F589195388D20070C39A; | |
| 35 | + remoteInfo = CNLiveTips; | |
| 36 | + }; | |
| 37 | +/* End PBXContainerItemProxy section */ | |
| 38 | + | |
| 39 | +/* Begin PBXFileReference section */ | |
| 40 | + 18C8349248A92308875C79B3 /* Pods-CNLiveTips_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveTips_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CNLiveTips_Example/Pods-CNLiveTips_Example.debug.xcconfig"; sourceTree = "<group>"; }; | |
| 41 | + 6003F58A195388D20070C39A /* CNLiveTips_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CNLiveTips_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 42 | + 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | |
| 43 | + 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; | |
| 44 | + 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; | |
| 45 | + 6003F595195388D20070C39A /* CNLiveTips-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CNLiveTips-Info.plist"; sourceTree = "<group>"; }; | |
| 46 | + 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | |
| 47 | + 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; | |
| 48 | + 6003F59B195388D20070C39A /* CNLiveTips-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CNLiveTips-Prefix.pch"; sourceTree = "<group>"; }; | |
| 49 | + 6003F59C195388D20070C39A /* CNLiveAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNLiveAppDelegate.h; sourceTree = "<group>"; }; | |
| 50 | + 6003F59D195388D20070C39A /* CNLiveAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CNLiveAppDelegate.m; sourceTree = "<group>"; }; | |
| 51 | + 6003F5A5195388D20070C39A /* CNLiveViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNLiveViewController.h; sourceTree = "<group>"; }; | |
| 52 | + 6003F5A6195388D20070C39A /* CNLiveViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CNLiveViewController.m; sourceTree = "<group>"; }; | |
| 53 | + 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; }; | |
| 54 | + 6003F5AE195388D20070C39A /* CNLiveTips_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CNLiveTips_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 55 | + 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; | |
| 56 | + 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = "<group>"; }; | |
| 57 | + 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; | |
| 58 | + 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = "<group>"; }; | |
| 59 | + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = "<group>"; }; | |
| 60 | + 61C4D4A6DF48C94CD58DD039 /* Pods-CNLiveTips_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveTips_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-CNLiveTips_Example/Pods-CNLiveTips_Example.release.xcconfig"; sourceTree = "<group>"; }; | |
| 61 | + 67D6D9E0E8BF2D51593F5C2C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; }; | |
| 62 | + 6853CE004E0E373C865C08B8 /* CNLiveTips.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = CNLiveTips.podspec; path = ../CNLiveTips.podspec; sourceTree = "<group>"; }; | |
| 63 | + 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | |
| 64 | + 85BB4856A2A9D0DC029357E2 /* Pods-CNLiveTips_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveTips_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-CNLiveTips_Tests/Pods-CNLiveTips_Tests.release.xcconfig"; sourceTree = "<group>"; }; | |
| 65 | + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; | |
| 66 | + 8F39793F0BF081B0E538341D /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; }; | |
| 67 | + A1AA0E495CA19DDB96E886B3 /* Pods_CNLiveTips_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CNLiveTips_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 68 | + A3F6E3D93A8B2C2AE821BFBE /* Pods-CNLiveTips_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CNLiveTips_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CNLiveTips_Tests/Pods-CNLiveTips_Tests.debug.xcconfig"; sourceTree = "<group>"; }; | |
| 69 | + ABF3A445D726DBBD6536765F /* Pods_CNLiveTips_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CNLiveTips_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | |
| 70 | +/* End PBXFileReference section */ | |
| 71 | + | |
| 72 | +/* Begin PBXFrameworksBuildPhase section */ | |
| 73 | + 6003F587195388D20070C39A /* Frameworks */ = { | |
| 74 | + isa = PBXFrameworksBuildPhase; | |
| 75 | + buildActionMask = 2147483647; | |
| 76 | + files = ( | |
| 77 | + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, | |
| 78 | + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, | |
| 79 | + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, | |
| 80 | + 4DB2A92BA3B7E6063A7B2C55 /* Pods_CNLiveTips_Example.framework in Frameworks */, | |
| 81 | + ); | |
| 82 | + runOnlyForDeploymentPostprocessing = 0; | |
| 83 | + }; | |
| 84 | + 6003F5AB195388D20070C39A /* Frameworks */ = { | |
| 85 | + isa = PBXFrameworksBuildPhase; | |
| 86 | + buildActionMask = 2147483647; | |
| 87 | + files = ( | |
| 88 | + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, | |
| 89 | + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, | |
| 90 | + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, | |
| 91 | + B54328BFB8875FDB13113019 /* Pods_CNLiveTips_Tests.framework in Frameworks */, | |
| 92 | + ); | |
| 93 | + runOnlyForDeploymentPostprocessing = 0; | |
| 94 | + }; | |
| 95 | +/* End PBXFrameworksBuildPhase section */ | |
| 96 | + | |
| 97 | +/* Begin PBXGroup section */ | |
| 98 | + 3F14D3055474573E9DF96BA1 /* Pods */ = { | |
| 99 | + isa = PBXGroup; | |
| 100 | + children = ( | |
| 101 | + 18C8349248A92308875C79B3 /* Pods-CNLiveTips_Example.debug.xcconfig */, | |
| 102 | + 61C4D4A6DF48C94CD58DD039 /* Pods-CNLiveTips_Example.release.xcconfig */, | |
| 103 | + A3F6E3D93A8B2C2AE821BFBE /* Pods-CNLiveTips_Tests.debug.xcconfig */, | |
| 104 | + 85BB4856A2A9D0DC029357E2 /* Pods-CNLiveTips_Tests.release.xcconfig */, | |
| 105 | + ); | |
| 106 | + name = Pods; | |
| 107 | + sourceTree = "<group>"; | |
| 108 | + }; | |
| 109 | + 6003F581195388D10070C39A = { | |
| 110 | + isa = PBXGroup; | |
| 111 | + children = ( | |
| 112 | + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, | |
| 113 | + 6003F593195388D20070C39A /* Example for CNLiveTips */, | |
| 114 | + 6003F5B5195388D20070C39A /* Tests */, | |
| 115 | + 6003F58C195388D20070C39A /* Frameworks */, | |
| 116 | + 6003F58B195388D20070C39A /* Products */, | |
| 117 | + 3F14D3055474573E9DF96BA1 /* Pods */, | |
| 118 | + ); | |
| 119 | + sourceTree = "<group>"; | |
| 120 | + }; | |
| 121 | + 6003F58B195388D20070C39A /* Products */ = { | |
| 122 | + isa = PBXGroup; | |
| 123 | + children = ( | |
| 124 | + 6003F58A195388D20070C39A /* CNLiveTips_Example.app */, | |
| 125 | + 6003F5AE195388D20070C39A /* CNLiveTips_Tests.xctest */, | |
| 126 | + ); | |
| 127 | + name = Products; | |
| 128 | + sourceTree = "<group>"; | |
| 129 | + }; | |
| 130 | + 6003F58C195388D20070C39A /* Frameworks */ = { | |
| 131 | + isa = PBXGroup; | |
| 132 | + children = ( | |
| 133 | + 6003F58D195388D20070C39A /* Foundation.framework */, | |
| 134 | + 6003F58F195388D20070C39A /* CoreGraphics.framework */, | |
| 135 | + 6003F591195388D20070C39A /* UIKit.framework */, | |
| 136 | + 6003F5AF195388D20070C39A /* XCTest.framework */, | |
| 137 | + A1AA0E495CA19DDB96E886B3 /* Pods_CNLiveTips_Example.framework */, | |
| 138 | + ABF3A445D726DBBD6536765F /* Pods_CNLiveTips_Tests.framework */, | |
| 139 | + ); | |
| 140 | + name = Frameworks; | |
| 141 | + sourceTree = "<group>"; | |
| 142 | + }; | |
| 143 | + 6003F593195388D20070C39A /* Example for CNLiveTips */ = { | |
| 144 | + isa = PBXGroup; | |
| 145 | + children = ( | |
| 146 | + 6003F59C195388D20070C39A /* CNLiveAppDelegate.h */, | |
| 147 | + 6003F59D195388D20070C39A /* CNLiveAppDelegate.m */, | |
| 148 | + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, | |
| 149 | + 6003F5A5195388D20070C39A /* CNLiveViewController.h */, | |
| 150 | + 6003F5A6195388D20070C39A /* CNLiveViewController.m */, | |
| 151 | + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, | |
| 152 | + 6003F5A8195388D20070C39A /* Images.xcassets */, | |
| 153 | + 6003F594195388D20070C39A /* Supporting Files */, | |
| 154 | + ); | |
| 155 | + name = "Example for CNLiveTips"; | |
| 156 | + path = CNLiveTips; | |
| 157 | + sourceTree = "<group>"; | |
| 158 | + }; | |
| 159 | + 6003F594195388D20070C39A /* Supporting Files */ = { | |
| 160 | + isa = PBXGroup; | |
| 161 | + children = ( | |
| 162 | + 6003F595195388D20070C39A /* CNLiveTips-Info.plist */, | |
| 163 | + 6003F596195388D20070C39A /* InfoPlist.strings */, | |
| 164 | + 6003F599195388D20070C39A /* main.m */, | |
| 165 | + 6003F59B195388D20070C39A /* CNLiveTips-Prefix.pch */, | |
| 166 | + ); | |
| 167 | + name = "Supporting Files"; | |
| 168 | + sourceTree = "<group>"; | |
| 169 | + }; | |
| 170 | + 6003F5B5195388D20070C39A /* Tests */ = { | |
| 171 | + isa = PBXGroup; | |
| 172 | + children = ( | |
| 173 | + 6003F5BB195388D20070C39A /* Tests.m */, | |
| 174 | + 6003F5B6195388D20070C39A /* Supporting Files */, | |
| 175 | + ); | |
| 176 | + path = Tests; | |
| 177 | + sourceTree = "<group>"; | |
| 178 | + }; | |
| 179 | + 6003F5B6195388D20070C39A /* Supporting Files */ = { | |
| 180 | + isa = PBXGroup; | |
| 181 | + children = ( | |
| 182 | + 6003F5B7195388D20070C39A /* Tests-Info.plist */, | |
| 183 | + 6003F5B8195388D20070C39A /* InfoPlist.strings */, | |
| 184 | + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, | |
| 185 | + ); | |
| 186 | + name = "Supporting Files"; | |
| 187 | + sourceTree = "<group>"; | |
| 188 | + }; | |
| 189 | + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { | |
| 190 | + isa = PBXGroup; | |
| 191 | + children = ( | |
| 192 | + 6853CE004E0E373C865C08B8 /* CNLiveTips.podspec */, | |
| 193 | + 67D6D9E0E8BF2D51593F5C2C /* README.md */, | |
| 194 | + 8F39793F0BF081B0E538341D /* LICENSE */, | |
| 195 | + ); | |
| 196 | + name = "Podspec Metadata"; | |
| 197 | + sourceTree = "<group>"; | |
| 198 | + }; | |
| 199 | +/* End PBXGroup section */ | |
| 200 | + | |
| 201 | +/* Begin PBXNativeTarget section */ | |
| 202 | + 6003F589195388D20070C39A /* CNLiveTips_Example */ = { | |
| 203 | + isa = PBXNativeTarget; | |
| 204 | + buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveTips_Example" */; | |
| 205 | + buildPhases = ( | |
| 206 | + 0CE10C3258CB82125230C7CA /* [CP] Check Pods Manifest.lock */, | |
| 207 | + 6003F586195388D20070C39A /* Sources */, | |
| 208 | + 6003F587195388D20070C39A /* Frameworks */, | |
| 209 | + 6003F588195388D20070C39A /* Resources */, | |
| 210 | + DA2AC345FC738FBAD4D6E190 /* [CP] Embed Pods Frameworks */, | |
| 211 | + ); | |
| 212 | + buildRules = ( | |
| 213 | + ); | |
| 214 | + dependencies = ( | |
| 215 | + ); | |
| 216 | + name = CNLiveTips_Example; | |
| 217 | + productName = CNLiveTips; | |
| 218 | + productReference = 6003F58A195388D20070C39A /* CNLiveTips_Example.app */; | |
| 219 | + productType = "com.apple.product-type.application"; | |
| 220 | + }; | |
| 221 | + 6003F5AD195388D20070C39A /* CNLiveTips_Tests */ = { | |
| 222 | + isa = PBXNativeTarget; | |
| 223 | + buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveTips_Tests" */; | |
| 224 | + buildPhases = ( | |
| 225 | + FE150900B04CF8D930DDB67F /* [CP] Check Pods Manifest.lock */, | |
| 226 | + 6003F5AA195388D20070C39A /* Sources */, | |
| 227 | + 6003F5AB195388D20070C39A /* Frameworks */, | |
| 228 | + 6003F5AC195388D20070C39A /* Resources */, | |
| 229 | + ECE2418126D287FA3DCEACEB /* [CP] Embed Pods Frameworks */, | |
| 230 | + ); | |
| 231 | + buildRules = ( | |
| 232 | + ); | |
| 233 | + dependencies = ( | |
| 234 | + 6003F5B4195388D20070C39A /* PBXTargetDependency */, | |
| 235 | + ); | |
| 236 | + name = CNLiveTips_Tests; | |
| 237 | + productName = CNLiveTipsTests; | |
| 238 | + productReference = 6003F5AE195388D20070C39A /* CNLiveTips_Tests.xctest */; | |
| 239 | + productType = "com.apple.product-type.bundle.unit-test"; | |
| 240 | + }; | |
| 241 | +/* End PBXNativeTarget section */ | |
| 242 | + | |
| 243 | +/* Begin PBXProject section */ | |
| 244 | + 6003F582195388D10070C39A /* Project object */ = { | |
| 245 | + isa = PBXProject; | |
| 246 | + attributes = { | |
| 247 | + CLASSPREFIX = CNLive; | |
| 248 | + LastUpgradeCheck = 0720; | |
| 249 | + ORGANIZATIONNAME = "殷巧娟"; | |
| 250 | + TargetAttributes = { | |
| 251 | + 6003F589195388D20070C39A = { | |
| 252 | + DevelopmentTeam = 94X49GG3ZW; | |
| 253 | + }; | |
| 254 | + 6003F5AD195388D20070C39A = { | |
| 255 | + TestTargetID = 6003F589195388D20070C39A; | |
| 256 | + }; | |
| 257 | + }; | |
| 258 | + }; | |
| 259 | + buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "CNLiveTips" */; | |
| 260 | + compatibilityVersion = "Xcode 3.2"; | |
| 261 | + developmentRegion = English; | |
| 262 | + hasScannedForEncodings = 0; | |
| 263 | + knownRegions = ( | |
| 264 | + en, | |
| 265 | + Base, | |
| 266 | + ); | |
| 267 | + mainGroup = 6003F581195388D10070C39A; | |
| 268 | + productRefGroup = 6003F58B195388D20070C39A /* Products */; | |
| 269 | + projectDirPath = ""; | |
| 270 | + projectRoot = ""; | |
| 271 | + targets = ( | |
| 272 | + 6003F589195388D20070C39A /* CNLiveTips_Example */, | |
| 273 | + 6003F5AD195388D20070C39A /* CNLiveTips_Tests */, | |
| 274 | + ); | |
| 275 | + }; | |
| 276 | +/* End PBXProject section */ | |
| 277 | + | |
| 278 | +/* Begin PBXResourcesBuildPhase section */ | |
| 279 | + 6003F588195388D20070C39A /* Resources */ = { | |
| 280 | + isa = PBXResourcesBuildPhase; | |
| 281 | + buildActionMask = 2147483647; | |
| 282 | + files = ( | |
| 283 | + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, | |
| 284 | + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, | |
| 285 | + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, | |
| 286 | + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, | |
| 287 | + ); | |
| 288 | + runOnlyForDeploymentPostprocessing = 0; | |
| 289 | + }; | |
| 290 | + 6003F5AC195388D20070C39A /* Resources */ = { | |
| 291 | + isa = PBXResourcesBuildPhase; | |
| 292 | + buildActionMask = 2147483647; | |
| 293 | + files = ( | |
| 294 | + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, | |
| 295 | + ); | |
| 296 | + runOnlyForDeploymentPostprocessing = 0; | |
| 297 | + }; | |
| 298 | +/* End PBXResourcesBuildPhase section */ | |
| 299 | + | |
| 300 | +/* Begin PBXShellScriptBuildPhase section */ | |
| 301 | + 0CE10C3258CB82125230C7CA /* [CP] Check Pods Manifest.lock */ = { | |
| 302 | + isa = PBXShellScriptBuildPhase; | |
| 303 | + buildActionMask = 2147483647; | |
| 304 | + files = ( | |
| 305 | + ); | |
| 306 | + inputFileListPaths = ( | |
| 307 | + ); | |
| 308 | + inputPaths = ( | |
| 309 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 310 | + "${PODS_ROOT}/Manifest.lock", | |
| 311 | + ); | |
| 312 | + name = "[CP] Check Pods Manifest.lock"; | |
| 313 | + outputFileListPaths = ( | |
| 314 | + ); | |
| 315 | + outputPaths = ( | |
| 316 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveTips_Example-checkManifestLockResult.txt", | |
| 317 | + ); | |
| 318 | + runOnlyForDeploymentPostprocessing = 0; | |
| 319 | + shellPath = /bin/sh; | |
| 320 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 321 | + showEnvVarsInLog = 0; | |
| 322 | + }; | |
| 323 | + DA2AC345FC738FBAD4D6E190 /* [CP] Embed Pods Frameworks */ = { | |
| 324 | + isa = PBXShellScriptBuildPhase; | |
| 325 | + buildActionMask = 2147483647; | |
| 326 | + files = ( | |
| 327 | + ); | |
| 328 | + inputFileListPaths = ( | |
| 329 | + ); | |
| 330 | + inputPaths = ( | |
| 331 | + "${SRCROOT}/Pods/Target Support Files/Pods-CNLiveTips_Example/Pods-CNLiveTips_Example-frameworks.sh", | |
| 332 | + "${BUILT_PRODUCTS_DIR}/CNLiveTips/CNLiveTips.framework", | |
| 333 | + "${BUILT_PRODUCTS_DIR}/QMUIKit/QMUIKit.framework", | |
| 334 | + ); | |
| 335 | + name = "[CP] Embed Pods Frameworks"; | |
| 336 | + outputFileListPaths = ( | |
| 337 | + ); | |
| 338 | + outputPaths = ( | |
| 339 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveTips.framework", | |
| 340 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QMUIKit.framework", | |
| 341 | + ); | |
| 342 | + runOnlyForDeploymentPostprocessing = 0; | |
| 343 | + shellPath = /bin/sh; | |
| 344 | + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CNLiveTips_Example/Pods-CNLiveTips_Example-frameworks.sh\"\n"; | |
| 345 | + showEnvVarsInLog = 0; | |
| 346 | + }; | |
| 347 | + ECE2418126D287FA3DCEACEB /* [CP] Embed Pods Frameworks */ = { | |
| 348 | + isa = PBXShellScriptBuildPhase; | |
| 349 | + buildActionMask = 2147483647; | |
| 350 | + files = ( | |
| 351 | + ); | |
| 352 | + inputFileListPaths = ( | |
| 353 | + ); | |
| 354 | + inputPaths = ( | |
| 355 | + "${SRCROOT}/Pods/Target Support Files/Pods-CNLiveTips_Tests/Pods-CNLiveTips_Tests-frameworks.sh", | |
| 356 | + "${BUILT_PRODUCTS_DIR}/QMUIKit/QMUIKit.framework", | |
| 357 | + ); | |
| 358 | + name = "[CP] Embed Pods Frameworks"; | |
| 359 | + outputFileListPaths = ( | |
| 360 | + ); | |
| 361 | + outputPaths = ( | |
| 362 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QMUIKit.framework", | |
| 363 | + ); | |
| 364 | + runOnlyForDeploymentPostprocessing = 0; | |
| 365 | + shellPath = /bin/sh; | |
| 366 | + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CNLiveTips_Tests/Pods-CNLiveTips_Tests-frameworks.sh\"\n"; | |
| 367 | + showEnvVarsInLog = 0; | |
| 368 | + }; | |
| 369 | + FE150900B04CF8D930DDB67F /* [CP] Check Pods Manifest.lock */ = { | |
| 370 | + isa = PBXShellScriptBuildPhase; | |
| 371 | + buildActionMask = 2147483647; | |
| 372 | + files = ( | |
| 373 | + ); | |
| 374 | + inputFileListPaths = ( | |
| 375 | + ); | |
| 376 | + inputPaths = ( | |
| 377 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 378 | + "${PODS_ROOT}/Manifest.lock", | |
| 379 | + ); | |
| 380 | + name = "[CP] Check Pods Manifest.lock"; | |
| 381 | + outputFileListPaths = ( | |
| 382 | + ); | |
| 383 | + outputPaths = ( | |
| 384 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveTips_Tests-checkManifestLockResult.txt", | |
| 385 | + ); | |
| 386 | + runOnlyForDeploymentPostprocessing = 0; | |
| 387 | + shellPath = /bin/sh; | |
| 388 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 389 | + showEnvVarsInLog = 0; | |
| 390 | + }; | |
| 391 | +/* End PBXShellScriptBuildPhase section */ | |
| 392 | + | |
| 393 | +/* Begin PBXSourcesBuildPhase section */ | |
| 394 | + 6003F586195388D20070C39A /* Sources */ = { | |
| 395 | + isa = PBXSourcesBuildPhase; | |
| 396 | + buildActionMask = 2147483647; | |
| 397 | + files = ( | |
| 398 | + 6003F59E195388D20070C39A /* CNLiveAppDelegate.m in Sources */, | |
| 399 | + 6003F5A7195388D20070C39A /* CNLiveViewController.m in Sources */, | |
| 400 | + 6003F59A195388D20070C39A /* main.m in Sources */, | |
| 401 | + ); | |
| 402 | + runOnlyForDeploymentPostprocessing = 0; | |
| 403 | + }; | |
| 404 | + 6003F5AA195388D20070C39A /* Sources */ = { | |
| 405 | + isa = PBXSourcesBuildPhase; | |
| 406 | + buildActionMask = 2147483647; | |
| 407 | + files = ( | |
| 408 | + 6003F5BC195388D20070C39A /* Tests.m in Sources */, | |
| 409 | + ); | |
| 410 | + runOnlyForDeploymentPostprocessing = 0; | |
| 411 | + }; | |
| 412 | +/* End PBXSourcesBuildPhase section */ | |
| 413 | + | |
| 414 | +/* Begin PBXTargetDependency section */ | |
| 415 | + 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { | |
| 416 | + isa = PBXTargetDependency; | |
| 417 | + target = 6003F589195388D20070C39A /* CNLiveTips_Example */; | |
| 418 | + targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; | |
| 419 | + }; | |
| 420 | +/* End PBXTargetDependency section */ | |
| 421 | + | |
| 422 | +/* Begin PBXVariantGroup section */ | |
| 423 | + 6003F596195388D20070C39A /* InfoPlist.strings */ = { | |
| 424 | + isa = PBXVariantGroup; | |
| 425 | + children = ( | |
| 426 | + 6003F597195388D20070C39A /* en */, | |
| 427 | + ); | |
| 428 | + name = InfoPlist.strings; | |
| 429 | + sourceTree = "<group>"; | |
| 430 | + }; | |
| 431 | + 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { | |
| 432 | + isa = PBXVariantGroup; | |
| 433 | + children = ( | |
| 434 | + 6003F5B9195388D20070C39A /* en */, | |
| 435 | + ); | |
| 436 | + name = InfoPlist.strings; | |
| 437 | + sourceTree = "<group>"; | |
| 438 | + }; | |
| 439 | + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { | |
| 440 | + isa = PBXVariantGroup; | |
| 441 | + children = ( | |
| 442 | + 71719F9E1E33DC2100824A3D /* Base */, | |
| 443 | + ); | |
| 444 | + name = LaunchScreen.storyboard; | |
| 445 | + sourceTree = "<group>"; | |
| 446 | + }; | |
| 447 | +/* End PBXVariantGroup section */ | |
| 448 | + | |
| 449 | +/* Begin XCBuildConfiguration section */ | |
| 450 | + 6003F5BD195388D20070C39A /* Debug */ = { | |
| 451 | + isa = XCBuildConfiguration; | |
| 452 | + buildSettings = { | |
| 453 | + ALWAYS_SEARCH_USER_PATHS = NO; | |
| 454 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |
| 455 | + CLANG_CXX_LIBRARY = "libc++"; | |
| 456 | + CLANG_ENABLE_MODULES = YES; | |
| 457 | + CLANG_ENABLE_OBJC_ARC = YES; | |
| 458 | + CLANG_WARN_BOOL_CONVERSION = YES; | |
| 459 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | |
| 460 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |
| 461 | + CLANG_WARN_EMPTY_BODY = YES; | |
| 462 | + CLANG_WARN_ENUM_CONVERSION = YES; | |
| 463 | + CLANG_WARN_INT_CONVERSION = YES; | |
| 464 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |
| 465 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |
| 466 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |
| 467 | + COPY_PHASE_STRIP = NO; | |
| 468 | + ENABLE_TESTABILITY = YES; | |
| 469 | + GCC_C_LANGUAGE_STANDARD = gnu99; | |
| 470 | + GCC_DYNAMIC_NO_PIC = NO; | |
| 471 | + GCC_OPTIMIZATION_LEVEL = 0; | |
| 472 | + GCC_PREPROCESSOR_DEFINITIONS = ( | |
| 473 | + "DEBUG=1", | |
| 474 | + "$(inherited)", | |
| 475 | + ); | |
| 476 | + GCC_SYMBOLS_PRIVATE_EXTERN = NO; | |
| 477 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |
| 478 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |
| 479 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | |
| 480 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |
| 481 | + GCC_WARN_UNUSED_FUNCTION = YES; | |
| 482 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
| 483 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 484 | + ONLY_ACTIVE_ARCH = YES; | |
| 485 | + SDKROOT = iphoneos; | |
| 486 | + TARGETED_DEVICE_FAMILY = "1,2"; | |
| 487 | + }; | |
| 488 | + name = Debug; | |
| 489 | + }; | |
| 490 | + 6003F5BE195388D20070C39A /* Release */ = { | |
| 491 | + isa = XCBuildConfiguration; | |
| 492 | + buildSettings = { | |
| 493 | + ALWAYS_SEARCH_USER_PATHS = NO; | |
| 494 | + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | |
| 495 | + CLANG_CXX_LIBRARY = "libc++"; | |
| 496 | + CLANG_ENABLE_MODULES = YES; | |
| 497 | + CLANG_ENABLE_OBJC_ARC = YES; | |
| 498 | + CLANG_WARN_BOOL_CONVERSION = YES; | |
| 499 | + CLANG_WARN_CONSTANT_CONVERSION = YES; | |
| 500 | + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | |
| 501 | + CLANG_WARN_EMPTY_BODY = YES; | |
| 502 | + CLANG_WARN_ENUM_CONVERSION = YES; | |
| 503 | + CLANG_WARN_INT_CONVERSION = YES; | |
| 504 | + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | |
| 505 | + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | |
| 506 | + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | |
| 507 | + COPY_PHASE_STRIP = YES; | |
| 508 | + ENABLE_NS_ASSERTIONS = NO; | |
| 509 | + GCC_C_LANGUAGE_STANDARD = gnu99; | |
| 510 | + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | |
| 511 | + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | |
| 512 | + GCC_WARN_UNDECLARED_SELECTOR = YES; | |
| 513 | + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | |
| 514 | + GCC_WARN_UNUSED_FUNCTION = YES; | |
| 515 | + GCC_WARN_UNUSED_VARIABLE = YES; | |
| 516 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 517 | + SDKROOT = iphoneos; | |
| 518 | + TARGETED_DEVICE_FAMILY = "1,2"; | |
| 519 | + VALIDATE_PRODUCT = YES; | |
| 520 | + }; | |
| 521 | + name = Release; | |
| 522 | + }; | |
| 523 | + 6003F5C0195388D20070C39A /* Debug */ = { | |
| 524 | + isa = XCBuildConfiguration; | |
| 525 | + baseConfigurationReference = 18C8349248A92308875C79B3 /* Pods-CNLiveTips_Example.debug.xcconfig */; | |
| 526 | + buildSettings = { | |
| 527 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |
| 528 | + DEVELOPMENT_TEAM = 94X49GG3ZW; | |
| 529 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 530 | + GCC_PREFIX_HEADER = "CNLiveTips/CNLiveTips-Prefix.pch"; | |
| 531 | + INFOPLIST_FILE = "CNLiveTips/CNLiveTips-Info.plist"; | |
| 532 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 533 | + MODULE_NAME = ExampleApp; | |
| 534 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 535 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 536 | + WRAPPER_EXTENSION = app; | |
| 537 | + }; | |
| 538 | + name = Debug; | |
| 539 | + }; | |
| 540 | + 6003F5C1195388D20070C39A /* Release */ = { | |
| 541 | + isa = XCBuildConfiguration; | |
| 542 | + baseConfigurationReference = 61C4D4A6DF48C94CD58DD039 /* Pods-CNLiveTips_Example.release.xcconfig */; | |
| 543 | + buildSettings = { | |
| 544 | + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | |
| 545 | + DEVELOPMENT_TEAM = 94X49GG3ZW; | |
| 546 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 547 | + GCC_PREFIX_HEADER = "CNLiveTips/CNLiveTips-Prefix.pch"; | |
| 548 | + INFOPLIST_FILE = "CNLiveTips/CNLiveTips-Info.plist"; | |
| 549 | + IPHONEOS_DEPLOYMENT_TARGET = 9.3; | |
| 550 | + MODULE_NAME = ExampleApp; | |
| 551 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 552 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 553 | + WRAPPER_EXTENSION = app; | |
| 554 | + }; | |
| 555 | + name = Release; | |
| 556 | + }; | |
| 557 | + 6003F5C3195388D20070C39A /* Debug */ = { | |
| 558 | + isa = XCBuildConfiguration; | |
| 559 | + baseConfigurationReference = A3F6E3D93A8B2C2AE821BFBE /* Pods-CNLiveTips_Tests.debug.xcconfig */; | |
| 560 | + buildSettings = { | |
| 561 | + BUNDLE_LOADER = "$(TEST_HOST)"; | |
| 562 | + FRAMEWORK_SEARCH_PATHS = ( | |
| 563 | + "$(SDKROOT)/Developer/Library/Frameworks", | |
| 564 | + "$(inherited)", | |
| 565 | + "$(DEVELOPER_FRAMEWORKS_DIR)", | |
| 566 | + ); | |
| 567 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 568 | + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; | |
| 569 | + GCC_PREPROCESSOR_DEFINITIONS = ( | |
| 570 | + "DEBUG=1", | |
| 571 | + "$(inherited)", | |
| 572 | + ); | |
| 573 | + INFOPLIST_FILE = "Tests/Tests-Info.plist"; | |
| 574 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 575 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 576 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CNLiveTips_Example.app/CNLiveTips_Example"; | |
| 577 | + WRAPPER_EXTENSION = xctest; | |
| 578 | + }; | |
| 579 | + name = Debug; | |
| 580 | + }; | |
| 581 | + 6003F5C4195388D20070C39A /* Release */ = { | |
| 582 | + isa = XCBuildConfiguration; | |
| 583 | + baseConfigurationReference = 85BB4856A2A9D0DC029357E2 /* Pods-CNLiveTips_Tests.release.xcconfig */; | |
| 584 | + buildSettings = { | |
| 585 | + BUNDLE_LOADER = "$(TEST_HOST)"; | |
| 586 | + FRAMEWORK_SEARCH_PATHS = ( | |
| 587 | + "$(SDKROOT)/Developer/Library/Frameworks", | |
| 588 | + "$(inherited)", | |
| 589 | + "$(DEVELOPER_FRAMEWORKS_DIR)", | |
| 590 | + ); | |
| 591 | + GCC_PRECOMPILE_PREFIX_HEADER = YES; | |
| 592 | + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; | |
| 593 | + INFOPLIST_FILE = "Tests/Tests-Info.plist"; | |
| 594 | + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; | |
| 595 | + PRODUCT_NAME = "$(TARGET_NAME)"; | |
| 596 | + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CNLiveTips_Example.app/CNLiveTips_Example"; | |
| 597 | + WRAPPER_EXTENSION = xctest; | |
| 598 | + }; | |
| 599 | + name = Release; | |
| 600 | + }; | |
| 601 | +/* End XCBuildConfiguration section */ | |
| 602 | + | |
| 603 | +/* Begin XCConfigurationList section */ | |
| 604 | + 6003F585195388D10070C39A /* Build configuration list for PBXProject "CNLiveTips" */ = { | |
| 605 | + isa = XCConfigurationList; | |
| 606 | + buildConfigurations = ( | |
| 607 | + 6003F5BD195388D20070C39A /* Debug */, | |
| 608 | + 6003F5BE195388D20070C39A /* Release */, | |
| 609 | + ); | |
| 610 | + defaultConfigurationIsVisible = 0; | |
| 611 | + defaultConfigurationName = Release; | |
| 612 | + }; | |
| 613 | + 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveTips_Example" */ = { | |
| 614 | + isa = XCConfigurationList; | |
| 615 | + buildConfigurations = ( | |
| 616 | + 6003F5C0195388D20070C39A /* Debug */, | |
| 617 | + 6003F5C1195388D20070C39A /* Release */, | |
| 618 | + ); | |
| 619 | + defaultConfigurationIsVisible = 0; | |
| 620 | + defaultConfigurationName = Release; | |
| 621 | + }; | |
| 622 | + 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "CNLiveTips_Tests" */ = { | |
| 623 | + isa = XCConfigurationList; | |
| 624 | + buildConfigurations = ( | |
| 625 | + 6003F5C3195388D20070C39A /* Debug */, | |
| 626 | + 6003F5C4195388D20070C39A /* Release */, | |
| 627 | + ); | |
| 628 | + defaultConfigurationIsVisible = 0; | |
| 629 | + defaultConfigurationName = Release; | |
| 630 | + }; | |
| 631 | +/* End XCConfigurationList section */ | |
| 632 | + }; | |
| 633 | + rootObject = 6003F582195388D10070C39A /* Project object */; | |
| 634 | +} | ... | ... |
Example/CNLiveTips.xcodeproj/project.xcworkspace/contents.xcworkspacedata
0 → 100644
Example/CNLiveTips.xcodeproj/xcshareddata/xcschemes/CNLiveTips-Example.xcscheme
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<Scheme | |
| 3 | + LastUpgradeVersion = "0720" | |
| 4 | + version = "1.3"> | |
| 5 | + <BuildAction | |
| 6 | + parallelizeBuildables = "YES" | |
| 7 | + buildImplicitDependencies = "YES"> | |
| 8 | + <BuildActionEntries> | |
| 9 | + <BuildActionEntry | |
| 10 | + buildForTesting = "YES" | |
| 11 | + buildForRunning = "YES" | |
| 12 | + buildForProfiling = "YES" | |
| 13 | + buildForArchiving = "YES" | |
| 14 | + buildForAnalyzing = "YES"> | |
| 15 | + <BuildableReference | |
| 16 | + BuildableIdentifier = "primary" | |
| 17 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 18 | + BuildableName = "CNLiveTips_Example.app" | |
| 19 | + BlueprintName = "CNLiveTips_Example" | |
| 20 | + ReferencedContainer = "container:CNLiveTips.xcodeproj"> | |
| 21 | + </BuildableReference> | |
| 22 | + </BuildActionEntry> | |
| 23 | + </BuildActionEntries> | |
| 24 | + </BuildAction> | |
| 25 | + <TestAction | |
| 26 | + buildConfiguration = "Debug" | |
| 27 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |
| 28 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |
| 29 | + shouldUseLaunchSchemeArgsEnv = "YES"> | |
| 30 | + <Testables> | |
| 31 | + <TestableReference | |
| 32 | + skipped = "NO"> | |
| 33 | + <BuildableReference | |
| 34 | + BuildableIdentifier = "primary" | |
| 35 | + BlueprintIdentifier = "6003F5AD195388D20070C39A" | |
| 36 | + BuildableName = "CNLiveTips_Tests.xctest" | |
| 37 | + BlueprintName = "CNLiveTips_Tests" | |
| 38 | + ReferencedContainer = "container:CNLiveTips.xcodeproj"> | |
| 39 | + </BuildableReference> | |
| 40 | + </TestableReference> | |
| 41 | + </Testables> | |
| 42 | + <MacroExpansion> | |
| 43 | + <BuildableReference | |
| 44 | + BuildableIdentifier = "primary" | |
| 45 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 46 | + BuildableName = "CNLiveTips_Example.app" | |
| 47 | + BlueprintName = "CNLiveTips_Example" | |
| 48 | + ReferencedContainer = "container:CNLiveTips.xcodeproj"> | |
| 49 | + </BuildableReference> | |
| 50 | + </MacroExpansion> | |
| 51 | + <AdditionalOptions> | |
| 52 | + </AdditionalOptions> | |
| 53 | + </TestAction> | |
| 54 | + <LaunchAction | |
| 55 | + buildConfiguration = "Debug" | |
| 56 | + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | |
| 57 | + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | |
| 58 | + launchStyle = "0" | |
| 59 | + useCustomWorkingDirectory = "NO" | |
| 60 | + ignoresPersistentStateOnLaunch = "NO" | |
| 61 | + debugDocumentVersioning = "YES" | |
| 62 | + debugServiceExtension = "internal" | |
| 63 | + allowLocationSimulation = "YES"> | |
| 64 | + <BuildableProductRunnable | |
| 65 | + runnableDebuggingMode = "0"> | |
| 66 | + <BuildableReference | |
| 67 | + BuildableIdentifier = "primary" | |
| 68 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 69 | + BuildableName = "CNLiveTips_Example.app" | |
| 70 | + BlueprintName = "CNLiveTips_Example" | |
| 71 | + ReferencedContainer = "container:CNLiveTips.xcodeproj"> | |
| 72 | + </BuildableReference> | |
| 73 | + </BuildableProductRunnable> | |
| 74 | + <AdditionalOptions> | |
| 75 | + </AdditionalOptions> | |
| 76 | + </LaunchAction> | |
| 77 | + <ProfileAction | |
| 78 | + buildConfiguration = "Release" | |
| 79 | + shouldUseLaunchSchemeArgsEnv = "YES" | |
| 80 | + savedToolIdentifier = "" | |
| 81 | + useCustomWorkingDirectory = "NO" | |
| 82 | + debugDocumentVersioning = "YES"> | |
| 83 | + <BuildableProductRunnable | |
| 84 | + runnableDebuggingMode = "0"> | |
| 85 | + <BuildableReference | |
| 86 | + BuildableIdentifier = "primary" | |
| 87 | + BlueprintIdentifier = "6003F589195388D20070C39A" | |
| 88 | + BuildableName = "CNLiveTips_Example.app" | |
| 89 | + BlueprintName = "CNLiveTips_Example" | |
| 90 | + ReferencedContainer = "container:CNLiveTips.xcodeproj"> | |
| 91 | + </BuildableReference> | |
| 92 | + </BuildableProductRunnable> | |
| 93 | + </ProfileAction> | |
| 94 | + <AnalyzeAction | |
| 95 | + buildConfiguration = "Debug"> | |
| 96 | + </AnalyzeAction> | |
| 97 | + <ArchiveAction | |
| 98 | + buildConfiguration = "Release" | |
| 99 | + revealArchiveInOrganizer = "YES"> | |
| 100 | + </ArchiveAction> | |
| 101 | +</Scheme> | ... | ... |
Example/CNLiveTips.xcworkspace/contents.xcworkspacedata
0 → 100644
Example/CNLiveTips.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
0 → 100644
Example/CNLiveTips/Base.lproj/LaunchScreen.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | |
| 3 | + <device id="retina4_7" orientation="portrait"> | |
| 4 | + <adaptation id="fullscreen"/> | |
| 5 | + </device> | |
| 6 | + <dependencies> | |
| 7 | + <deployment identifier="iOS"/> | |
| 8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
| 9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
| 10 | + </dependencies> | |
| 11 | + <scenes> | |
| 12 | + <!--View Controller--> | |
| 13 | + <scene sceneID="EHf-IW-A2E"> | |
| 14 | + <objects> | |
| 15 | + <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | |
| 16 | + <layoutGuides> | |
| 17 | + <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/> | |
| 18 | + <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/> | |
| 19 | + </layoutGuides> | |
| 20 | + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | |
| 21 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
| 22 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
| 23 | + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
| 24 | + </view> | |
| 25 | + </viewController> | |
| 26 | + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
| 27 | + </objects> | |
| 28 | + <point key="canvasLocation" x="53" y="375"/> | |
| 29 | + </scene> | |
| 30 | + </scenes> | |
| 31 | +</document> | ... | ... |
Example/CNLiveTips/Base.lproj/Main.storyboard
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="whP-gf-Uak"> | |
| 3 | + <device id="retina4_7" orientation="portrait"> | |
| 4 | + <adaptation id="fullscreen"/> | |
| 5 | + </device> | |
| 6 | + <dependencies> | |
| 7 | + <deployment identifier="iOS"/> | |
| 8 | + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> | |
| 9 | + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | |
| 10 | + </dependencies> | |
| 11 | + <scenes> | |
| 12 | + <!--View Controller--> | |
| 13 | + <scene sceneID="wQg-tq-qST"> | |
| 14 | + <objects> | |
| 15 | + <viewController id="whP-gf-Uak" customClass="CNLiveViewController" sceneMemberID="viewController"> | |
| 16 | + <layoutGuides> | |
| 17 | + <viewControllerLayoutGuide type="top" id="uEw-UM-LJ8"/> | |
| 18 | + <viewControllerLayoutGuide type="bottom" id="Mvr-aV-6Um"/> | |
| 19 | + </layoutGuides> | |
| 20 | + <view key="view" contentMode="scaleToFill" id="TpU-gO-2f1"> | |
| 21 | + <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> | |
| 22 | + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | |
| 23 | + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |
| 24 | + </view> | |
| 25 | + </viewController> | |
| 26 | + <placeholder placeholderIdentifier="IBFirstResponder" id="tc2-Qw-aMS" userLabel="First Responder" sceneMemberID="firstResponder"/> | |
| 27 | + </objects> | |
| 28 | + <point key="canvasLocation" x="305" y="433"/> | |
| 29 | + </scene> | |
| 30 | + </scenes> | |
| 31 | +</document> | ... | ... |
Example/CNLiveTips/CNLiveAppDelegate.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveAppDelegate.h | |
| 3 | +// CNLiveTips | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 12/26/2018. | |
| 6 | +// Copyright (c) 2018 殷巧娟. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +@import UIKit; | |
| 10 | + | |
| 11 | +@interface CNLiveAppDelegate : UIResponder <UIApplicationDelegate> | |
| 12 | + | |
| 13 | +@property (strong, nonatomic) UIWindow *window; | |
| 14 | + | |
| 15 | +@end | ... | ... |
Example/CNLiveTips/CNLiveAppDelegate.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveAppDelegate.m | |
| 3 | +// CNLiveTips | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 12/26/2018. | |
| 6 | +// Copyright (c) 2018 殷巧娟. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveAppDelegate.h" | |
| 10 | + | |
| 11 | +@implementation CNLiveAppDelegate | |
| 12 | + | |
| 13 | +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | |
| 14 | +{ | |
| 15 | + // Override point for customization after application launch. | |
| 16 | + return YES; | |
| 17 | +} | |
| 18 | + | |
| 19 | +- (void)applicationWillResignActive:(UIApplication *)application | |
| 20 | +{ | |
| 21 | + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. | |
| 22 | + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. | |
| 23 | +} | |
| 24 | + | |
| 25 | +- (void)applicationDidEnterBackground:(UIApplication *)application | |
| 26 | +{ | |
| 27 | + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. | |
| 28 | + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. | |
| 29 | +} | |
| 30 | + | |
| 31 | +- (void)applicationWillEnterForeground:(UIApplication *)application | |
| 32 | +{ | |
| 33 | + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. | |
| 34 | +} | |
| 35 | + | |
| 36 | +- (void)applicationDidBecomeActive:(UIApplication *)application | |
| 37 | +{ | |
| 38 | + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. | |
| 39 | +} | |
| 40 | + | |
| 41 | +- (void)applicationWillTerminate:(UIApplication *)application | |
| 42 | +{ | |
| 43 | + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. | |
| 44 | +} | |
| 45 | + | |
| 46 | +@end | ... | ... |
Example/CNLiveTips/CNLiveTips-Info.plist
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |
| 3 | +<plist version="1.0"> | |
| 4 | +<dict> | |
| 5 | + <key>CFBundleDevelopmentRegion</key> | |
| 6 | + <string>en</string> | |
| 7 | + <key>CFBundleDisplayName</key> | |
| 8 | + <string>${PRODUCT_NAME}</string> | |
| 9 | + <key>CFBundleExecutable</key> | |
| 10 | + <string>${EXECUTABLE_NAME}</string> | |
| 11 | + <key>CFBundleIdentifier</key> | |
| 12 | + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | |
| 13 | + <key>CFBundleInfoDictionaryVersion</key> | |
| 14 | + <string>6.0</string> | |
| 15 | + <key>CFBundleName</key> | |
| 16 | + <string>${PRODUCT_NAME}</string> | |
| 17 | + <key>CFBundlePackageType</key> | |
| 18 | + <string>APPL</string> | |
| 19 | + <key>CFBundleShortVersionString</key> | |
| 20 | + <string>1.0</string> | |
| 21 | + <key>CFBundleSignature</key> | |
| 22 | + <string>????</string> | |
| 23 | + <key>CFBundleVersion</key> | |
| 24 | + <string>1.0</string> | |
| 25 | + <key>LSRequiresIPhoneOS</key> | |
| 26 | + <true/> | |
| 27 | + <key>UILaunchStoryboardName</key> | |
| 28 | + <string>LaunchScreen</string> | |
| 29 | + <key>UIMainStoryboardFile</key> | |
| 30 | + <string>Main</string> | |
| 31 | + <key>UIRequiredDeviceCapabilities</key> | |
| 32 | + <array> | |
| 33 | + <string>armv7</string> | |
| 34 | + </array> | |
| 35 | + <key>UISupportedInterfaceOrientations</key> | |
| 36 | + <array> | |
| 37 | + <string>UIInterfaceOrientationPortrait</string> | |
| 38 | + <string>UIInterfaceOrientationLandscapeLeft</string> | |
| 39 | + <string>UIInterfaceOrientationLandscapeRight</string> | |
| 40 | + </array> | |
| 41 | + <key>UISupportedInterfaceOrientations~ipad</key> | |
| 42 | + <array> | |
| 43 | + <string>UIInterfaceOrientationPortrait</string> | |
| 44 | + <string>UIInterfaceOrientationPortraitUpsideDown</string> | |
| 45 | + <string>UIInterfaceOrientationLandscapeLeft</string> | |
| 46 | + <string>UIInterfaceOrientationLandscapeRight</string> | |
| 47 | + </array> | |
| 48 | +</dict> | |
| 49 | +</plist> | ... | ... |
Example/CNLiveTips/CNLiveTips-Prefix.pch
0 → 100644
| 1 | +// | |
| 2 | +// Prefix header | |
| 3 | +// | |
| 4 | +// The contents of this file are implicitly included at the beginning of every source file. | |
| 5 | +// | |
| 6 | + | |
| 7 | +#import <Availability.h> | |
| 8 | + | |
| 9 | +#ifndef __IPHONE_5_0 | |
| 10 | +#warning "This project uses features only available in iOS SDK 5.0 and later." | |
| 11 | +#endif | |
| 12 | + | |
| 13 | +#ifdef __OBJC__ | |
| 14 | + @import UIKit; | |
| 15 | + @import Foundation; | |
| 16 | +#endif | ... | ... |
Example/CNLiveTips/CNLiveViewController.h
0 → 100644
Example/CNLiveTips/CNLiveViewController.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveViewController.m | |
| 3 | +// CNLiveTips | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 12/26/2018. | |
| 6 | +// Copyright (c) 2018 殷巧娟. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveViewController.h" | |
| 10 | + | |
| 11 | +@interface CNLiveViewController () | |
| 12 | + | |
| 13 | +@end | |
| 14 | + | |
| 15 | +@implementation CNLiveViewController | |
| 16 | + | |
| 17 | +- (void)viewDidLoad | |
| 18 | +{ | |
| 19 | + [super viewDidLoad]; | |
| 20 | + // Do any additional setup after loading the view, typically from a nib. | |
| 21 | +} | |
| 22 | + | |
| 23 | +- (void)didReceiveMemoryWarning | |
| 24 | +{ | |
| 25 | + [super didReceiveMemoryWarning]; | |
| 26 | + // Dispose of any resources that can be recreated. | |
| 27 | +} | |
| 28 | + | |
| 29 | +@end | ... | ... |
Example/CNLiveTips/Images.xcassets/AppIcon.appiconset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "iphone", | |
| 5 | + "size" : "20x20", | |
| 6 | + "scale" : "2x" | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "idiom" : "iphone", | |
| 10 | + "size" : "20x20", | |
| 11 | + "scale" : "3x" | |
| 12 | + }, | |
| 13 | + { | |
| 14 | + "idiom" : "iphone", | |
| 15 | + "size" : "29x29", | |
| 16 | + "scale" : "2x" | |
| 17 | + }, | |
| 18 | + { | |
| 19 | + "idiom" : "iphone", | |
| 20 | + "size" : "29x29", | |
| 21 | + "scale" : "3x" | |
| 22 | + }, | |
| 23 | + { | |
| 24 | + "idiom" : "iphone", | |
| 25 | + "size" : "40x40", | |
| 26 | + "scale" : "2x" | |
| 27 | + }, | |
| 28 | + { | |
| 29 | + "idiom" : "iphone", | |
| 30 | + "size" : "40x40", | |
| 31 | + "scale" : "3x" | |
| 32 | + }, | |
| 33 | + { | |
| 34 | + "idiom" : "iphone", | |
| 35 | + "size" : "60x60", | |
| 36 | + "scale" : "2x" | |
| 37 | + }, | |
| 38 | + { | |
| 39 | + "idiom" : "iphone", | |
| 40 | + "size" : "60x60", | |
| 41 | + "scale" : "3x" | |
| 42 | + }, | |
| 43 | + { | |
| 44 | + "idiom" : "ipad", | |
| 45 | + "size" : "20x20", | |
| 46 | + "scale" : "1x" | |
| 47 | + }, | |
| 48 | + { | |
| 49 | + "idiom" : "ipad", | |
| 50 | + "size" : "20x20", | |
| 51 | + "scale" : "2x" | |
| 52 | + }, | |
| 53 | + { | |
| 54 | + "idiom" : "ipad", | |
| 55 | + "size" : "29x29", | |
| 56 | + "scale" : "1x" | |
| 57 | + }, | |
| 58 | + { | |
| 59 | + "idiom" : "ipad", | |
| 60 | + "size" : "29x29", | |
| 61 | + "scale" : "2x" | |
| 62 | + }, | |
| 63 | + { | |
| 64 | + "idiom" : "ipad", | |
| 65 | + "size" : "40x40", | |
| 66 | + "scale" : "1x" | |
| 67 | + }, | |
| 68 | + { | |
| 69 | + "idiom" : "ipad", | |
| 70 | + "size" : "40x40", | |
| 71 | + "scale" : "2x" | |
| 72 | + }, | |
| 73 | + { | |
| 74 | + "idiom" : "ipad", | |
| 75 | + "size" : "76x76", | |
| 76 | + "scale" : "1x" | |
| 77 | + }, | |
| 78 | + { | |
| 79 | + "idiom" : "ipad", | |
| 80 | + "size" : "76x76", | |
| 81 | + "scale" : "2x" | |
| 82 | + }, | |
| 83 | + { | |
| 84 | + "idiom" : "ipad", | |
| 85 | + "size" : "83.5x83.5", | |
| 86 | + "scale" : "2x" | |
| 87 | + }, | |
| 88 | + { | |
| 89 | + "idiom" : "ios-marketing", | |
| 90 | + "size" : "1024x1024", | |
| 91 | + "scale" : "1x" | |
| 92 | + } | |
| 93 | + ], | |
| 94 | + "info" : { | |
| 95 | + "version" : 1, | |
| 96 | + "author" : "xcode" | |
| 97 | + } | |
| 98 | +} | ... | ... |
Example/CNLiveTips/en.lproj/InfoPlist.strings
0 → 100644
Example/CNLiveTips/main.m
0 → 100644
| 1 | +// | |
| 2 | +// main.m | |
| 3 | +// CNLiveTips | |
| 4 | +// | |
| 5 | +// Created by 殷巧娟 on 12/26/2018. | |
| 6 | +// Copyright (c) 2018 殷巧娟. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +@import UIKit; | |
| 10 | +#import "CNLiveAppDelegate.h" | |
| 11 | + | |
| 12 | +int main(int argc, char * argv[]) | |
| 13 | +{ | |
| 14 | + @autoreleasepool { | |
| 15 | + return UIApplicationMain(argc, argv, nil, NSStringFromClass([CNLiveAppDelegate class])); | |
| 16 | + } | |
| 17 | +} | ... | ... |
Example/Podfile
0 → 100644
Example/Podfile.lock
0 → 100644
| 1 | +PODS: | |
| 2 | + - CNLiveTips (0.0.1): | |
| 3 | + - QMUIKit | |
| 4 | + - QMUIKit (2.9.3): | |
| 5 | + - QMUIKit/QMUIComponents (= 2.9.3) | |
| 6 | + - QMUIKit/QMUICore (= 2.9.3) | |
| 7 | + - QMUIKit/QMUILog (= 2.9.3) | |
| 8 | + - QMUIKit/QMUIMainFrame (= 2.9.3) | |
| 9 | + - QMUIKit/QMUIResources (= 2.9.3) | |
| 10 | + - QMUIKit/QMUIWeakObjectContainer (= 2.9.3) | |
| 11 | + - QMUIKit/QMUIComponents (2.9.3): | |
| 12 | + - QMUIKit/QMUIComponents/NavigationBarTransition (= 2.9.3) | |
| 13 | + - QMUIKit/QMUIComponents/QMUIAlertController (= 2.9.3) | |
| 14 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary (= 2.9.3) | |
| 15 | + - QMUIKit/QMUIComponents/QMUIBadge (= 2.9.3) | |
| 16 | + - QMUIKit/QMUIComponents/QMUIButton (= 2.9.3) | |
| 17 | + - QMUIKit/QMUIComponents/QMUICAAnimationExtension (= 2.9.3) | |
| 18 | + - QMUIKit/QMUIComponents/QMUICellHeightCache (= 2.9.3) | |
| 19 | + - QMUIKit/QMUIComponents/QMUICellHeightKeyCache (= 2.9.3) | |
| 20 | + - QMUIKit/QMUIComponents/QMUICellSizeKeyCache (= 2.9.3) | |
| 21 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout (= 2.9.3) | |
| 22 | + - QMUIKit/QMUIComponents/QMUIDialogViewController (= 2.9.3) | |
| 23 | + - QMUIKit/QMUIComponents/QMUIEmotionInputManager (= 2.9.3) | |
| 24 | + - QMUIKit/QMUIComponents/QMUIEmotionView (= 2.9.3) | |
| 25 | + - QMUIKit/QMUIComponents/QMUIEmptyView (= 2.9.3) | |
| 26 | + - QMUIKit/QMUIComponents/QMUIFillButton (= 2.9.3) | |
| 27 | + - QMUIKit/QMUIComponents/QMUIFloatLayoutView (= 2.9.3) | |
| 28 | + - QMUIKit/QMUIComponents/QMUIGhostButton (= 2.9.3) | |
| 29 | + - QMUIKit/QMUIComponents/QMUIGridView (= 2.9.3) | |
| 30 | + - QMUIKit/QMUIComponents/QMUIImagePickerLibrary (= 2.9.3) | |
| 31 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView (= 2.9.3) | |
| 32 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager (= 2.9.3) | |
| 33 | + - QMUIKit/QMUIComponents/QMUILabel (= 2.9.3) | |
| 34 | + - QMUIKit/QMUIComponents/QMUILinkButton (= 2.9.3) | |
| 35 | + - QMUIKit/QMUIComponents/QMUILogManagerViewController (= 2.9.3) | |
| 36 | + - QMUIKit/QMUIComponents/QMUILogWithConfigurationSupported (= 2.9.3) | |
| 37 | + - QMUIKit/QMUIComponents/QMUIMarqueeLabel (= 2.9.3) | |
| 38 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController (= 2.9.3) | |
| 39 | + - QMUIKit/QMUIComponents/QMUIMoreOperationController (= 2.9.3) | |
| 40 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates (= 2.9.3) | |
| 41 | + - QMUIKit/QMUIComponents/QMUINavigationButton (= 2.9.3) | |
| 42 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView (= 2.9.3) | |
| 43 | + - QMUIKit/QMUIComponents/QMUIOrderedDictionary (= 2.9.3) | |
| 44 | + - QMUIKit/QMUIComponents/QMUIPieProgressView (= 2.9.3) | |
| 45 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView (= 2.9.3) | |
| 46 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView (= 2.9.3) | |
| 47 | + - QMUIKit/QMUIComponents/QMUIScrollAnimator (= 2.9.3) | |
| 48 | + - QMUIKit/QMUIComponents/QMUISearchBar (= 2.9.3) | |
| 49 | + - QMUIKit/QMUIComponents/QMUISearchController (= 2.9.3) | |
| 50 | + - QMUIKit/QMUIComponents/QMUISegmentedControl (= 2.9.3) | |
| 51 | + - QMUIKit/QMUIComponents/QMUISlider (= 2.9.3) | |
| 52 | + - QMUIKit/QMUIComponents/QMUIStaticTableView (= 2.9.3) | |
| 53 | + - QMUIKit/QMUIComponents/QMUITableView (= 2.9.3) | |
| 54 | + - QMUIKit/QMUIComponents/QMUITableViewCell (= 2.9.3) | |
| 55 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView (= 2.9.3) | |
| 56 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols (= 2.9.3) | |
| 57 | + - QMUIKit/QMUIComponents/QMUITestView (= 2.9.3) | |
| 58 | + - QMUIKit/QMUIComponents/QMUITextField (= 2.9.3) | |
| 59 | + - QMUIKit/QMUIComponents/QMUITextView (= 2.9.3) | |
| 60 | + - QMUIKit/QMUIComponents/QMUITips (= 2.9.3) | |
| 61 | + - QMUIKit/QMUIComponents/QMUIToastView (= 2.9.3) | |
| 62 | + - QMUIKit/QMUIComponents/QMUIToolbarButton (= 2.9.3) | |
| 63 | + - QMUIKit/QMUIComponents/QMUIVisualEffectView (= 2.9.3) | |
| 64 | + - QMUIKit/QMUIComponents/QMUIZoomImageView (= 2.9.3) | |
| 65 | + - QMUIKit/QMUICore | |
| 66 | + - QMUIKit/QMUIComponents/NavigationBarTransition (2.9.3): | |
| 67 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 68 | + - QMUIKit/QMUICore | |
| 69 | + - QMUIKit/QMUIMainFrame | |
| 70 | + - QMUIKit/QMUIComponents/QMUIAlertController (2.9.3): | |
| 71 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 72 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 73 | + - QMUIKit/QMUIComponents/QMUITextField | |
| 74 | + - QMUIKit/QMUICore | |
| 75 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary (2.9.3): | |
| 76 | + - QMUIKit/QMUICore | |
| 77 | + - QMUIKit/QMUIComponents/QMUIBadge (2.9.3): | |
| 78 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 79 | + - QMUIKit/QMUICore | |
| 80 | + - QMUIKit/QMUIComponents/QMUIButton (2.9.3): | |
| 81 | + - QMUIKit/QMUICore | |
| 82 | + - QMUIKit/QMUIComponents/QMUICAAnimationExtension (2.9.3): | |
| 83 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 84 | + - QMUIKit/QMUICore | |
| 85 | + - QMUIKit/QMUIComponents/QMUICellHeightCache (2.9.3): | |
| 86 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 87 | + - QMUIKit/QMUICore | |
| 88 | + - QMUIKit/QMUIComponents/QMUICellHeightKeyCache (2.9.3): | |
| 89 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 90 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 91 | + - QMUIKit/QMUICore | |
| 92 | + - QMUIKit/QMUIComponents/QMUICellSizeKeyCache (2.9.3): | |
| 93 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 94 | + - QMUIKit/QMUICore | |
| 95 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout (2.9.3): | |
| 96 | + - QMUIKit/QMUICore | |
| 97 | + - QMUIKit/QMUIComponents/QMUIDialogViewController (2.9.3): | |
| 98 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 99 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 100 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 101 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 102 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 103 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 104 | + - QMUIKit/QMUIComponents/QMUITextField | |
| 105 | + - QMUIKit/QMUICore | |
| 106 | + - QMUIKit/QMUIMainFrame | |
| 107 | + - QMUIKit/QMUIComponents/QMUIEmotionInputManager (2.9.3): | |
| 108 | + - QMUIKit/QMUIComponents/QMUIEmotionView | |
| 109 | + - QMUIKit/QMUICore | |
| 110 | + - QMUIKit/QMUIComponents/QMUIEmotionView (2.9.3): | |
| 111 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 112 | + - QMUIKit/QMUICore | |
| 113 | + - QMUIKit/QMUIResources | |
| 114 | + - QMUIKit/QMUIComponents/QMUIEmptyView (2.9.3): | |
| 115 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 116 | + - QMUIKit/QMUICore | |
| 117 | + - QMUIKit/QMUIComponents/QMUIFillButton (2.9.3): | |
| 118 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 119 | + - QMUIKit/QMUICore | |
| 120 | + - QMUIKit/QMUIComponents/QMUIFloatLayoutView (2.9.3): | |
| 121 | + - QMUIKit/QMUICore | |
| 122 | + - QMUIKit/QMUIComponents/QMUIGhostButton (2.9.3): | |
| 123 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 124 | + - QMUIKit/QMUICore | |
| 125 | + - QMUIKit/QMUIComponents/QMUIGridView (2.9.3): | |
| 126 | + - QMUIKit/QMUICore | |
| 127 | + - QMUIKit/QMUIComponents/QMUIImagePickerLibrary (2.9.3): | |
| 128 | + - QMUIKit/QMUIComponents/QMUIAlertController | |
| 129 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary | |
| 130 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 131 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 132 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView | |
| 133 | + - QMUIKit/QMUIComponents/QMUINavigationButton | |
| 134 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 135 | + - QMUIKit/QMUIComponents/QMUIZoomImageView | |
| 136 | + - QMUIKit/QMUICore | |
| 137 | + - QMUIKit/QMUIMainFrame | |
| 138 | + - QMUIKit/QMUIResources | |
| 139 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView (2.9.3): | |
| 140 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 141 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout | |
| 142 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 143 | + - QMUIKit/QMUIComponents/QMUIPieProgressView | |
| 144 | + - QMUIKit/QMUIComponents/QMUIZoomImageView | |
| 145 | + - QMUIKit/QMUICore | |
| 146 | + - QMUIKit/QMUIMainFrame | |
| 147 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager (2.9.3): | |
| 148 | + - QMUIKit/QMUICore | |
| 149 | + - QMUIKit/QMUIComponents/QMUILabel (2.9.3): | |
| 150 | + - QMUIKit/QMUICore | |
| 151 | + - QMUIKit/QMUIComponents/QMUILinkButton (2.9.3): | |
| 152 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 153 | + - QMUIKit/QMUICore | |
| 154 | + - QMUIKit/QMUIComponents/QMUILogManagerViewController (2.9.3): | |
| 155 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView | |
| 156 | + - QMUIKit/QMUIComponents/QMUISearchController | |
| 157 | + - QMUIKit/QMUIComponents/QMUIStaticTableView | |
| 158 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 159 | + - QMUIKit/QMUICore | |
| 160 | + - QMUIKit/QMUIMainFrame | |
| 161 | + - QMUIKit/QMUIComponents/QMUILogWithConfigurationSupported (2.9.3): | |
| 162 | + - QMUIKit/QMUICore | |
| 163 | + - QMUIKit/QMUIComponents/QMUIMarqueeLabel (2.9.3): | |
| 164 | + - QMUIKit/QMUICore | |
| 165 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController (2.9.3): | |
| 166 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 167 | + - QMUIKit/QMUICore | |
| 168 | + - QMUIKit/QMUIComponents/QMUIMoreOperationController (2.9.3): | |
| 169 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 170 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 171 | + - QMUIKit/QMUICore | |
| 172 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates (2.9.3): | |
| 173 | + - QMUIKit/QMUICore | |
| 174 | + - QMUIKit/QMUIComponents/QMUINavigationButton (2.9.3): | |
| 175 | + - QMUIKit/QMUICore | |
| 176 | + - QMUIKit/QMUIMainFrame | |
| 177 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView (2.9.3): | |
| 178 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 179 | + - QMUIKit/QMUICore | |
| 180 | + - QMUIKit/QMUIComponents/QMUIOrderedDictionary (2.9.3): | |
| 181 | + - QMUIKit/QMUICore | |
| 182 | + - QMUIKit/QMUIComponents/QMUIPieProgressView (2.9.3): | |
| 183 | + - QMUIKit/QMUICore | |
| 184 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView (2.9.3): | |
| 185 | + - QMUIKit/QMUICore | |
| 186 | + - QMUIKit/QMUIMainFrame | |
| 187 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView (2.9.3): | |
| 188 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 189 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView | |
| 190 | + - QMUIKit/QMUICore | |
| 191 | + - QMUIKit/QMUIComponents/QMUIScrollAnimator (2.9.3): | |
| 192 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 193 | + - QMUIKit/QMUICore | |
| 194 | + - QMUIKit/QMUIComponents/QMUISearchBar (2.9.3): | |
| 195 | + - QMUIKit/QMUICore | |
| 196 | + - QMUIKit/QMUIComponents/QMUISearchController (2.9.3): | |
| 197 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 198 | + - QMUIKit/QMUIComponents/QMUISearchBar | |
| 199 | + - QMUIKit/QMUICore | |
| 200 | + - QMUIKit/QMUIMainFrame | |
| 201 | + - QMUIKit/QMUIComponents/QMUISegmentedControl (2.9.3): | |
| 202 | + - QMUIKit/QMUICore | |
| 203 | + - QMUIKit/QMUIComponents/QMUISlider (2.9.3): | |
| 204 | + - QMUIKit/QMUICore | |
| 205 | + - QMUIKit/QMUIComponents/QMUIStaticTableView (2.9.3): | |
| 206 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 207 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 208 | + - QMUIKit/QMUICore | |
| 209 | + - QMUIKit/QMUIComponents/QMUITableView (2.9.3): | |
| 210 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 211 | + - QMUIKit/QMUICore | |
| 212 | + - QMUIKit/QMUIComponents/QMUITableViewCell (2.9.3): | |
| 213 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 214 | + - QMUIKit/QMUICore | |
| 215 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView (2.9.3): | |
| 216 | + - QMUIKit/QMUICore | |
| 217 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols (2.9.3): | |
| 218 | + - QMUIKit/QMUICore | |
| 219 | + - QMUIKit/QMUIComponents/QMUITestView (2.9.3): | |
| 220 | + - QMUIKit/QMUICore | |
| 221 | + - QMUIKit/QMUIComponents/QMUITextField (2.9.3): | |
| 222 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 223 | + - QMUIKit/QMUICore | |
| 224 | + - QMUIKit/QMUIComponents/QMUITextView (2.9.3): | |
| 225 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 226 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 227 | + - QMUIKit/QMUICore | |
| 228 | + - QMUIKit/QMUIComponents/QMUITips (2.9.3): | |
| 229 | + - QMUIKit/QMUIComponents/QMUIToastView | |
| 230 | + - QMUIKit/QMUICore | |
| 231 | + - QMUIKit/QMUIResources | |
| 232 | + - QMUIKit/QMUIComponents/QMUIToastView (2.9.3): | |
| 233 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 234 | + - QMUIKit/QMUICore | |
| 235 | + - QMUIKit/QMUIComponents/QMUIToolbarButton (2.9.3): | |
| 236 | + - QMUIKit/QMUICore | |
| 237 | + - QMUIKit/QMUIComponents/QMUIVisualEffectView (2.9.3): | |
| 238 | + - QMUIKit/QMUICore | |
| 239 | + - QMUIKit/QMUIComponents/QMUIZoomImageView (2.9.3): | |
| 240 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary | |
| 241 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 242 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 243 | + - QMUIKit/QMUIComponents/QMUIPieProgressView | |
| 244 | + - QMUIKit/QMUIComponents/QMUISlider | |
| 245 | + - QMUIKit/QMUICore | |
| 246 | + - QMUIKit/QMUICore (2.9.3): | |
| 247 | + - QMUIKit/QMUILog | |
| 248 | + - QMUIKit/QMUIWeakObjectContainer | |
| 249 | + - QMUIKit/QMUILog (2.9.3) | |
| 250 | + - QMUIKit/QMUIMainFrame (2.9.3): | |
| 251 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 252 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 253 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 254 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 255 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 256 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView | |
| 257 | + - QMUIKit/QMUICore | |
| 258 | + - QMUIKit/QMUILog | |
| 259 | + - QMUIKit/QMUIResources (2.9.3) | |
| 260 | + - QMUIKit/QMUIWeakObjectContainer (2.9.3) | |
| 261 | + | |
| 262 | +DEPENDENCIES: | |
| 263 | + - CNLiveTips (from `../`) | |
| 264 | + - QMUIKit | |
| 265 | + | |
| 266 | +SPEC REPOS: | |
| 267 | + https://github.com/cocoapods/specs.git: | |
| 268 | + - QMUIKit | |
| 269 | + | |
| 270 | +EXTERNAL SOURCES: | |
| 271 | + CNLiveTips: | |
| 272 | + :path: "../" | |
| 273 | + | |
| 274 | +SPEC CHECKSUMS: | |
| 275 | + CNLiveTips: 6ec6ffd3cb0aadbfbaff016d6cce84617a299e65 | |
| 276 | + QMUIKit: 5b8f0a3ab60e42af1310bd40a6fe1b54d612d15c | |
| 277 | + | |
| 278 | +PODFILE CHECKSUM: 523da8b8330238bfcaf370f27851e3d415141c94 | |
| 279 | + | |
| 280 | +COCOAPODS: 1.5.3 | ... | ... |
Example/Pods/Local Podspecs/CNLiveTips.podspec.json
0 → 100644
| 1 | +{ | |
| 2 | + "name": "CNLiveTips", | |
| 3 | + "version": "0.0.1", | |
| 4 | + "summary": "封装QMUI弹框", | |
| 5 | + "description": "TODO: Add long description of the pod here.", | |
| 6 | + "homepage": "http://bj.gitlab.cnlive.com/ios-team/CNLiveTips", | |
| 7 | + "license": { | |
| 8 | + "type": "MIT", | |
| 9 | + "file": "LICENSE" | |
| 10 | + }, | |
| 11 | + "authors": { | |
| 12 | + "殷巧娟": "1427945373@qq.com" | |
| 13 | + }, | |
| 14 | + "source": { | |
| 15 | + "git": "http://bj.gitlab.cnlive.com/ios-team/CNLiveTips.git", | |
| 16 | + "tag": "0.0.1" | |
| 17 | + }, | |
| 18 | + "platforms": { | |
| 19 | + "ios": "9.0" | |
| 20 | + }, | |
| 21 | + "source_files": "CNLiveTips/Classes/**/*", | |
| 22 | + "frameworks": [ | |
| 23 | + "UIKit", | |
| 24 | + "Foundation" | |
| 25 | + ], | |
| 26 | + "dependencies": { | |
| 27 | + "QMUIKit": [ | |
| 28 | + | |
| 29 | + ] | |
| 30 | + } | |
| 31 | +} | ... | ... |
Example/Pods/Manifest.lock
0 → 100644
| 1 | +PODS: | |
| 2 | + - CNLiveTips (0.0.1): | |
| 3 | + - QMUIKit | |
| 4 | + - QMUIKit (2.9.3): | |
| 5 | + - QMUIKit/QMUIComponents (= 2.9.3) | |
| 6 | + - QMUIKit/QMUICore (= 2.9.3) | |
| 7 | + - QMUIKit/QMUILog (= 2.9.3) | |
| 8 | + - QMUIKit/QMUIMainFrame (= 2.9.3) | |
| 9 | + - QMUIKit/QMUIResources (= 2.9.3) | |
| 10 | + - QMUIKit/QMUIWeakObjectContainer (= 2.9.3) | |
| 11 | + - QMUIKit/QMUIComponents (2.9.3): | |
| 12 | + - QMUIKit/QMUIComponents/NavigationBarTransition (= 2.9.3) | |
| 13 | + - QMUIKit/QMUIComponents/QMUIAlertController (= 2.9.3) | |
| 14 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary (= 2.9.3) | |
| 15 | + - QMUIKit/QMUIComponents/QMUIBadge (= 2.9.3) | |
| 16 | + - QMUIKit/QMUIComponents/QMUIButton (= 2.9.3) | |
| 17 | + - QMUIKit/QMUIComponents/QMUICAAnimationExtension (= 2.9.3) | |
| 18 | + - QMUIKit/QMUIComponents/QMUICellHeightCache (= 2.9.3) | |
| 19 | + - QMUIKit/QMUIComponents/QMUICellHeightKeyCache (= 2.9.3) | |
| 20 | + - QMUIKit/QMUIComponents/QMUICellSizeKeyCache (= 2.9.3) | |
| 21 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout (= 2.9.3) | |
| 22 | + - QMUIKit/QMUIComponents/QMUIDialogViewController (= 2.9.3) | |
| 23 | + - QMUIKit/QMUIComponents/QMUIEmotionInputManager (= 2.9.3) | |
| 24 | + - QMUIKit/QMUIComponents/QMUIEmotionView (= 2.9.3) | |
| 25 | + - QMUIKit/QMUIComponents/QMUIEmptyView (= 2.9.3) | |
| 26 | + - QMUIKit/QMUIComponents/QMUIFillButton (= 2.9.3) | |
| 27 | + - QMUIKit/QMUIComponents/QMUIFloatLayoutView (= 2.9.3) | |
| 28 | + - QMUIKit/QMUIComponents/QMUIGhostButton (= 2.9.3) | |
| 29 | + - QMUIKit/QMUIComponents/QMUIGridView (= 2.9.3) | |
| 30 | + - QMUIKit/QMUIComponents/QMUIImagePickerLibrary (= 2.9.3) | |
| 31 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView (= 2.9.3) | |
| 32 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager (= 2.9.3) | |
| 33 | + - QMUIKit/QMUIComponents/QMUILabel (= 2.9.3) | |
| 34 | + - QMUIKit/QMUIComponents/QMUILinkButton (= 2.9.3) | |
| 35 | + - QMUIKit/QMUIComponents/QMUILogManagerViewController (= 2.9.3) | |
| 36 | + - QMUIKit/QMUIComponents/QMUILogWithConfigurationSupported (= 2.9.3) | |
| 37 | + - QMUIKit/QMUIComponents/QMUIMarqueeLabel (= 2.9.3) | |
| 38 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController (= 2.9.3) | |
| 39 | + - QMUIKit/QMUIComponents/QMUIMoreOperationController (= 2.9.3) | |
| 40 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates (= 2.9.3) | |
| 41 | + - QMUIKit/QMUIComponents/QMUINavigationButton (= 2.9.3) | |
| 42 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView (= 2.9.3) | |
| 43 | + - QMUIKit/QMUIComponents/QMUIOrderedDictionary (= 2.9.3) | |
| 44 | + - QMUIKit/QMUIComponents/QMUIPieProgressView (= 2.9.3) | |
| 45 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView (= 2.9.3) | |
| 46 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView (= 2.9.3) | |
| 47 | + - QMUIKit/QMUIComponents/QMUIScrollAnimator (= 2.9.3) | |
| 48 | + - QMUIKit/QMUIComponents/QMUISearchBar (= 2.9.3) | |
| 49 | + - QMUIKit/QMUIComponents/QMUISearchController (= 2.9.3) | |
| 50 | + - QMUIKit/QMUIComponents/QMUISegmentedControl (= 2.9.3) | |
| 51 | + - QMUIKit/QMUIComponents/QMUISlider (= 2.9.3) | |
| 52 | + - QMUIKit/QMUIComponents/QMUIStaticTableView (= 2.9.3) | |
| 53 | + - QMUIKit/QMUIComponents/QMUITableView (= 2.9.3) | |
| 54 | + - QMUIKit/QMUIComponents/QMUITableViewCell (= 2.9.3) | |
| 55 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView (= 2.9.3) | |
| 56 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols (= 2.9.3) | |
| 57 | + - QMUIKit/QMUIComponents/QMUITestView (= 2.9.3) | |
| 58 | + - QMUIKit/QMUIComponents/QMUITextField (= 2.9.3) | |
| 59 | + - QMUIKit/QMUIComponents/QMUITextView (= 2.9.3) | |
| 60 | + - QMUIKit/QMUIComponents/QMUITips (= 2.9.3) | |
| 61 | + - QMUIKit/QMUIComponents/QMUIToastView (= 2.9.3) | |
| 62 | + - QMUIKit/QMUIComponents/QMUIToolbarButton (= 2.9.3) | |
| 63 | + - QMUIKit/QMUIComponents/QMUIVisualEffectView (= 2.9.3) | |
| 64 | + - QMUIKit/QMUIComponents/QMUIZoomImageView (= 2.9.3) | |
| 65 | + - QMUIKit/QMUICore | |
| 66 | + - QMUIKit/QMUIComponents/NavigationBarTransition (2.9.3): | |
| 67 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 68 | + - QMUIKit/QMUICore | |
| 69 | + - QMUIKit/QMUIMainFrame | |
| 70 | + - QMUIKit/QMUIComponents/QMUIAlertController (2.9.3): | |
| 71 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 72 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 73 | + - QMUIKit/QMUIComponents/QMUITextField | |
| 74 | + - QMUIKit/QMUICore | |
| 75 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary (2.9.3): | |
| 76 | + - QMUIKit/QMUICore | |
| 77 | + - QMUIKit/QMUIComponents/QMUIBadge (2.9.3): | |
| 78 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 79 | + - QMUIKit/QMUICore | |
| 80 | + - QMUIKit/QMUIComponents/QMUIButton (2.9.3): | |
| 81 | + - QMUIKit/QMUICore | |
| 82 | + - QMUIKit/QMUIComponents/QMUICAAnimationExtension (2.9.3): | |
| 83 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 84 | + - QMUIKit/QMUICore | |
| 85 | + - QMUIKit/QMUIComponents/QMUICellHeightCache (2.9.3): | |
| 86 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 87 | + - QMUIKit/QMUICore | |
| 88 | + - QMUIKit/QMUIComponents/QMUICellHeightKeyCache (2.9.3): | |
| 89 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 90 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 91 | + - QMUIKit/QMUICore | |
| 92 | + - QMUIKit/QMUIComponents/QMUICellSizeKeyCache (2.9.3): | |
| 93 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 94 | + - QMUIKit/QMUICore | |
| 95 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout (2.9.3): | |
| 96 | + - QMUIKit/QMUICore | |
| 97 | + - QMUIKit/QMUIComponents/QMUIDialogViewController (2.9.3): | |
| 98 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 99 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 100 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 101 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 102 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 103 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 104 | + - QMUIKit/QMUIComponents/QMUITextField | |
| 105 | + - QMUIKit/QMUICore | |
| 106 | + - QMUIKit/QMUIMainFrame | |
| 107 | + - QMUIKit/QMUIComponents/QMUIEmotionInputManager (2.9.3): | |
| 108 | + - QMUIKit/QMUIComponents/QMUIEmotionView | |
| 109 | + - QMUIKit/QMUICore | |
| 110 | + - QMUIKit/QMUIComponents/QMUIEmotionView (2.9.3): | |
| 111 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 112 | + - QMUIKit/QMUICore | |
| 113 | + - QMUIKit/QMUIResources | |
| 114 | + - QMUIKit/QMUIComponents/QMUIEmptyView (2.9.3): | |
| 115 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 116 | + - QMUIKit/QMUICore | |
| 117 | + - QMUIKit/QMUIComponents/QMUIFillButton (2.9.3): | |
| 118 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 119 | + - QMUIKit/QMUICore | |
| 120 | + - QMUIKit/QMUIComponents/QMUIFloatLayoutView (2.9.3): | |
| 121 | + - QMUIKit/QMUICore | |
| 122 | + - QMUIKit/QMUIComponents/QMUIGhostButton (2.9.3): | |
| 123 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 124 | + - QMUIKit/QMUICore | |
| 125 | + - QMUIKit/QMUIComponents/QMUIGridView (2.9.3): | |
| 126 | + - QMUIKit/QMUICore | |
| 127 | + - QMUIKit/QMUIComponents/QMUIImagePickerLibrary (2.9.3): | |
| 128 | + - QMUIKit/QMUIComponents/QMUIAlertController | |
| 129 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary | |
| 130 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 131 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 132 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView | |
| 133 | + - QMUIKit/QMUIComponents/QMUINavigationButton | |
| 134 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 135 | + - QMUIKit/QMUIComponents/QMUIZoomImageView | |
| 136 | + - QMUIKit/QMUICore | |
| 137 | + - QMUIKit/QMUIMainFrame | |
| 138 | + - QMUIKit/QMUIResources | |
| 139 | + - QMUIKit/QMUIComponents/QMUIImagePreviewView (2.9.3): | |
| 140 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 141 | + - QMUIKit/QMUIComponents/QMUICollectionViewPagingLayout | |
| 142 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 143 | + - QMUIKit/QMUIComponents/QMUIPieProgressView | |
| 144 | + - QMUIKit/QMUIComponents/QMUIZoomImageView | |
| 145 | + - QMUIKit/QMUICore | |
| 146 | + - QMUIKit/QMUIMainFrame | |
| 147 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager (2.9.3): | |
| 148 | + - QMUIKit/QMUICore | |
| 149 | + - QMUIKit/QMUIComponents/QMUILabel (2.9.3): | |
| 150 | + - QMUIKit/QMUICore | |
| 151 | + - QMUIKit/QMUIComponents/QMUILinkButton (2.9.3): | |
| 152 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 153 | + - QMUIKit/QMUICore | |
| 154 | + - QMUIKit/QMUIComponents/QMUILogManagerViewController (2.9.3): | |
| 155 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView | |
| 156 | + - QMUIKit/QMUIComponents/QMUISearchController | |
| 157 | + - QMUIKit/QMUIComponents/QMUIStaticTableView | |
| 158 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 159 | + - QMUIKit/QMUICore | |
| 160 | + - QMUIKit/QMUIMainFrame | |
| 161 | + - QMUIKit/QMUIComponents/QMUILogWithConfigurationSupported (2.9.3): | |
| 162 | + - QMUIKit/QMUICore | |
| 163 | + - QMUIKit/QMUIComponents/QMUIMarqueeLabel (2.9.3): | |
| 164 | + - QMUIKit/QMUICore | |
| 165 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController (2.9.3): | |
| 166 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 167 | + - QMUIKit/QMUICore | |
| 168 | + - QMUIKit/QMUIComponents/QMUIMoreOperationController (2.9.3): | |
| 169 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 170 | + - QMUIKit/QMUIComponents/QMUIModalPresentationViewController | |
| 171 | + - QMUIKit/QMUICore | |
| 172 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates (2.9.3): | |
| 173 | + - QMUIKit/QMUICore | |
| 174 | + - QMUIKit/QMUIComponents/QMUINavigationButton (2.9.3): | |
| 175 | + - QMUIKit/QMUICore | |
| 176 | + - QMUIKit/QMUIMainFrame | |
| 177 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView (2.9.3): | |
| 178 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 179 | + - QMUIKit/QMUICore | |
| 180 | + - QMUIKit/QMUIComponents/QMUIOrderedDictionary (2.9.3): | |
| 181 | + - QMUIKit/QMUICore | |
| 182 | + - QMUIKit/QMUIComponents/QMUIPieProgressView (2.9.3): | |
| 183 | + - QMUIKit/QMUICore | |
| 184 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView (2.9.3): | |
| 185 | + - QMUIKit/QMUICore | |
| 186 | + - QMUIKit/QMUIMainFrame | |
| 187 | + - QMUIKit/QMUIComponents/QMUIPopupMenuView (2.9.3): | |
| 188 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 189 | + - QMUIKit/QMUIComponents/QMUIPopupContainerView | |
| 190 | + - QMUIKit/QMUICore | |
| 191 | + - QMUIKit/QMUIComponents/QMUIScrollAnimator (2.9.3): | |
| 192 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 193 | + - QMUIKit/QMUICore | |
| 194 | + - QMUIKit/QMUIComponents/QMUISearchBar (2.9.3): | |
| 195 | + - QMUIKit/QMUICore | |
| 196 | + - QMUIKit/QMUIComponents/QMUISearchController (2.9.3): | |
| 197 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 198 | + - QMUIKit/QMUIComponents/QMUISearchBar | |
| 199 | + - QMUIKit/QMUICore | |
| 200 | + - QMUIKit/QMUIMainFrame | |
| 201 | + - QMUIKit/QMUIComponents/QMUISegmentedControl (2.9.3): | |
| 202 | + - QMUIKit/QMUICore | |
| 203 | + - QMUIKit/QMUIComponents/QMUISlider (2.9.3): | |
| 204 | + - QMUIKit/QMUICore | |
| 205 | + - QMUIKit/QMUIComponents/QMUIStaticTableView (2.9.3): | |
| 206 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 207 | + - QMUIKit/QMUIComponents/QMUITableViewCell | |
| 208 | + - QMUIKit/QMUICore | |
| 209 | + - QMUIKit/QMUIComponents/QMUITableView (2.9.3): | |
| 210 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols | |
| 211 | + - QMUIKit/QMUICore | |
| 212 | + - QMUIKit/QMUIComponents/QMUITableViewCell (2.9.3): | |
| 213 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 214 | + - QMUIKit/QMUICore | |
| 215 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView (2.9.3): | |
| 216 | + - QMUIKit/QMUICore | |
| 217 | + - QMUIKit/QMUIComponents/QMUITableViewProtocols (2.9.3): | |
| 218 | + - QMUIKit/QMUICore | |
| 219 | + - QMUIKit/QMUIComponents/QMUITestView (2.9.3): | |
| 220 | + - QMUIKit/QMUICore | |
| 221 | + - QMUIKit/QMUIComponents/QMUITextField (2.9.3): | |
| 222 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 223 | + - QMUIKit/QMUICore | |
| 224 | + - QMUIKit/QMUIComponents/QMUITextView (2.9.3): | |
| 225 | + - QMUIKit/QMUIComponents/QMUILabel | |
| 226 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 227 | + - QMUIKit/QMUICore | |
| 228 | + - QMUIKit/QMUIComponents/QMUITips (2.9.3): | |
| 229 | + - QMUIKit/QMUIComponents/QMUIToastView | |
| 230 | + - QMUIKit/QMUICore | |
| 231 | + - QMUIKit/QMUIResources | |
| 232 | + - QMUIKit/QMUIComponents/QMUIToastView (2.9.3): | |
| 233 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 234 | + - QMUIKit/QMUICore | |
| 235 | + - QMUIKit/QMUIComponents/QMUIToolbarButton (2.9.3): | |
| 236 | + - QMUIKit/QMUICore | |
| 237 | + - QMUIKit/QMUIComponents/QMUIVisualEffectView (2.9.3): | |
| 238 | + - QMUIKit/QMUICore | |
| 239 | + - QMUIKit/QMUIComponents/QMUIZoomImageView (2.9.3): | |
| 240 | + - QMUIKit/QMUIComponents/QMUIAssetLibrary | |
| 241 | + - QMUIKit/QMUIComponents/QMUIButton | |
| 242 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 243 | + - QMUIKit/QMUIComponents/QMUIPieProgressView | |
| 244 | + - QMUIKit/QMUIComponents/QMUISlider | |
| 245 | + - QMUIKit/QMUICore | |
| 246 | + - QMUIKit/QMUICore (2.9.3): | |
| 247 | + - QMUIKit/QMUILog | |
| 248 | + - QMUIKit/QMUIWeakObjectContainer | |
| 249 | + - QMUIKit/QMUILog (2.9.3) | |
| 250 | + - QMUIKit/QMUIMainFrame (2.9.3): | |
| 251 | + - QMUIKit/QMUIComponents/QMUIEmptyView | |
| 252 | + - QMUIKit/QMUIComponents/QMUIKeyboardManager | |
| 253 | + - QMUIKit/QMUIComponents/QMUIMultipleDelegates | |
| 254 | + - QMUIKit/QMUIComponents/QMUINavigationTitleView | |
| 255 | + - QMUIKit/QMUIComponents/QMUITableView | |
| 256 | + - QMUIKit/QMUIComponents/QMUITableViewHeaderFooterView | |
| 257 | + - QMUIKit/QMUICore | |
| 258 | + - QMUIKit/QMUILog | |
| 259 | + - QMUIKit/QMUIResources (2.9.3) | |
| 260 | + - QMUIKit/QMUIWeakObjectContainer (2.9.3) | |
| 261 | + | |
| 262 | +DEPENDENCIES: | |
| 263 | + - CNLiveTips (from `../`) | |
| 264 | + - QMUIKit | |
| 265 | + | |
| 266 | +SPEC REPOS: | |
| 267 | + https://github.com/cocoapods/specs.git: | |
| 268 | + - QMUIKit | |
| 269 | + | |
| 270 | +EXTERNAL SOURCES: | |
| 271 | + CNLiveTips: | |
| 272 | + :path: "../" | |
| 273 | + | |
| 274 | +SPEC CHECKSUMS: | |
| 275 | + CNLiveTips: 6ec6ffd3cb0aadbfbaff016d6cce84617a299e65 | |
| 276 | + QMUIKit: 5b8f0a3ab60e42af1310bd40a6fe1b54d612d15c | |
| 277 | + | |
| 278 | +PODFILE CHECKSUM: 523da8b8330238bfcaf370f27851e3d415141c94 | |
| 279 | + | |
| 280 | +COCOAPODS: 1.5.3 | ... | ... |