Commit 05a34523e0b95a6380e8accf9f6d09d7381cf63e

Authored by yinqiaojuan
1 parent b2c41e70

提交0.0.1

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
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "self:CNLiveTips.xcodeproj">
  6 + </FileRef>
  7 +</Workspace>
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
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "group:CNLiveTips.xcodeproj">
  6 + </FileRef>
  7 + <FileRef
  8 + location = "group:Pods/Pods.xcodeproj">
  9 + </FileRef>
  10 +</Workspace>
Example/CNLiveTips.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
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
  1 +//
  2 +// CNLiveViewController.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 CNLiveViewController : UIViewController
  12 +
  13 +@end
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
  1 +/* Localized versions of Info.plist keys */
  2 +
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
  1 +use_frameworks!
  2 +
  3 +platform :ios, '9.0'
  4 +
  5 +target 'CNLiveTips_Example' do
  6 + pod 'CNLiveTips', :path => '../'
  7 + pod 'QMUIKit'
  8 +
  9 + target 'CNLiveTips_Tests' do
  10 + inherit! :search_paths
  11 + pod 'QMUIKit'
  12 + end
  13 +end
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