├── .gitignore ├── LICENSE ├── README.md ├── XHTagView.podspec ├── XHTagView ├── Classes │ ├── Header │ │ └── XHTagHeader.h │ ├── Layers │ │ ├── XHBranchLayer.h │ │ ├── XHBranchLayer.m │ │ ├── XHFocusLayer.h │ │ └── XHFocusLayer.m │ ├── Model │ │ ├── XHBranchPoint.h │ │ └── XHBranchPoint.m │ └── Views │ │ ├── XHBranchTextView.h │ │ ├── XHBranchTextView.m │ │ ├── XHCenterView.h │ │ ├── XHCenterView.m │ │ ├── XHTagView.h │ │ └── XHTagView.m └── Resources │ ├── tag-background-left@2x.png │ ├── tag-background-left@3x.png │ ├── tag-background-right@2x.png │ ├── tag-background-right@3x.png │ ├── tag-center@2x.png │ └── tag-center@3x.png └── XHTagViewDemo ├── Podfile ├── Podfile.lock ├── Pods ├── Headers │ ├── Private │ │ └── XHTagView │ │ │ ├── XHBranchLayer.h │ │ │ ├── XHBranchPoint.h │ │ │ ├── XHBranchTextView.h │ │ │ ├── XHCenterView.h │ │ │ ├── XHFocusLayer.h │ │ │ ├── XHTagHeader.h │ │ │ └── XHTagView.h │ └── Public │ │ └── XHTagView │ │ ├── XHBranchLayer.h │ │ ├── XHBranchPoint.h │ │ ├── XHBranchTextView.h │ │ ├── XHCenterView.h │ │ ├── XHFocusLayer.h │ │ ├── XHTagHeader.h │ │ └── XHTagView.h ├── Local Podspecs │ └── XHTagView.podspec.json ├── Manifest.lock ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── XHTagView.xcscheme └── Target Support Files │ ├── Pods-XHTagViewDemo │ ├── Pods-XHTagViewDemo-acknowledgements.markdown │ ├── Pods-XHTagViewDemo-acknowledgements.plist │ ├── Pods-XHTagViewDemo-dummy.m │ ├── Pods-XHTagViewDemo-frameworks.sh │ ├── Pods-XHTagViewDemo-resources.sh │ ├── Pods-XHTagViewDemo.debug.xcconfig │ └── Pods-XHTagViewDemo.release.xcconfig │ └── XHTagView │ ├── XHTagView-dummy.m │ ├── XHTagView-prefix.pch │ └── XHTagView.xcconfig ├── XHTagViewDemo.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── XHTagViewDemo.xcworkspace └── contents.xcworkspacedata ├── XHTagViewDemo ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon-Small@3x.png │ │ ├── Icon-Spotlight-40@2x.png │ │ └── Icon-Spotlight-40@3x.png │ ├── Contents.json │ └── Eat.imageset │ │ ├── Contents.json │ │ └── Eat@2x.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── ViewController.h ├── ViewController.m └── main.m ├── XHTagViewDemoTests ├── Info.plist └── XHTagViewDemoTests.m └── XHTagViewDemoUITests ├── Info.plist └── XHTagViewDemoUITests.m /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by http://www.gitignore.io 2 | 3 | #!! ERROR: obj is undefined. Use list command to see defined gitignore types !!# 4 | 5 | ### Objective-C ### 6 | # Xcode 7 | # 8 | build/ 9 | *.xcuserstate 10 | *.xcbkptlist 11 | *.pbxuser 12 | !default.pbxuser 13 | *.mode1v3 14 | !default.mode1v3 15 | *.mode2v3 16 | !default.mode2v3 17 | *.perspectivev3 18 | !default.perspectivev3 19 | xcuserdata 20 | *.xccheckout 21 | *.moved-aside 22 | DerivedData 23 | *.hmap 24 | *.ipa 25 | *.xcuserstate 26 | 27 | # CocoaPods 28 | # 29 | # We recommend against adding the Pods directory to your .gitignore. However 30 | # you should judge for yourself, the pros and cons are mentioned at: 31 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 32 | # 33 | # Pods/ 34 | 35 | .DS_Store 36 | 37 | *.xcscmblueprint 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 曾宪华 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TagView 2 | 3 | Blog describes how to design this effect. [Blog](http://zengxianhua.com) 4 | 5 | ![image](https://github.com/xhzengAIB/LearnEnglish/raw/master/Screenshots/XHTagView.gif) 6 | 7 | High efficiency Tag components. 8 | 9 | # CocoaPods 10 | 11 | 1. Add `pod 'XHTagView'` to your Podfile. 12 | 2. Run `pod install` or `pod update`. 13 | 3. Import \. 14 | 15 | # Requirements 16 | 17 | This library requires `iOS 6.0+` and `Xcode 7.0+`. 18 | 19 | # License 20 | 21 | XHTagView is provided under the MIT license. See LICENSE file for details. 22 | 23 | # 中文介绍 24 | 25 | 博客中描述了如何设计这个效果. [Blog](http://zengxianhua.com) 26 | 27 | 高效标签组件。 28 | 29 | # 安装 30 | 31 | 1. 在 `Podfile` 中添加 `pod 'XHTagView'`。 32 | 2. 执行 `pod install` 或 `pod update`。 33 | 3. 导入 ``。 34 | 35 | # 要求 36 | 37 | 该项目最低支持 `iOS 6.0+` 和 `Xcode 7.0`。 38 | 39 | # 许可证 40 | 41 | TagView 使用 MIT 许可证,详情见 LICENSE 文件。 42 | -------------------------------------------------------------------------------- /XHTagView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "XHTagView" 3 | s.version = "2.0" 4 | s.summary = "High efficiency Tag components." 5 | s.homepage = "https://github.com/xhzengAIB/TagView" 6 | s.license = "MIT" 7 | s.authors = { "Jack" => "xhzengAIB@gmail.com" } 8 | s.source = { :git => "https://github.com/xhzengAIB/TagView.git", :tag => s.version.to_s } 9 | s.frameworks = 'Foundation', 'UIKit' 10 | s.platform = :ios, '6.0' 11 | s.source_files = 'XHTagView/Classes/**/*.{h,m}' 12 | s.resources = 'XHTagView/Resources/*' 13 | s.requires_arc = true 14 | end 15 | -------------------------------------------------------------------------------- /XHTagView/Classes/Header/XHTagHeader.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHTagHeader.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | typedef NS_ENUM(NSInteger, XHBranchLayerDirection) { 10 | XHBranchLayerDirectionRight = 0, 11 | XHBranchLayerDirectionLeft, 12 | }; 13 | 14 | typedef NS_ENUM(NSInteger, XHTagAnimationStyle) { 15 | XHTagAnimationStyleAllLeft = 0, 16 | XHTagAnimationStyleAllRight, 17 | XHTagAnimationStyleDoubleLeft, 18 | XHTagAnimationStyleDoubleRight, 19 | }; -------------------------------------------------------------------------------- /XHTagView/Classes/Layers/XHBranchLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchLayer.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | #import "XHTagHeader.h" 13 | 14 | @class XHBranchLayer; 15 | 16 | typedef void(^XHBranchLayerAnimationCompletion)(BOOL finished, XHBranchLayer *branchLayer); 17 | 18 | @interface XHBranchLayer : CAShapeLayer 19 | 20 | /** 21 | * 分支在动画中的朝向 22 | * 23 | * 默认是右边 24 | */ 25 | @property (nonatomic, assign) XHBranchLayerDirection direction; 26 | 27 | /** 28 | * 分支在动画的起始位置 29 | * 30 | * 默认值 CGPointZero 31 | */ 32 | @property (nonatomic, assign) CGPoint startPoint; 33 | 34 | /** 35 | * 分支在动画的中间位置 36 | * 37 | * 默认值 CGPointZero 38 | */ 39 | @property (nonatomic, assign) CGPoint midPoint; 40 | 41 | /** 42 | * 分支在动画的结束位置 43 | * 44 | * 默认值 CGPointZero 45 | */ 46 | @property (nonatomic, assign) CGPoint endPoint; 47 | 48 | /** 49 | * 分支动画末梢圆的半径 50 | * 51 | * 默认值 3.0 52 | */ 53 | @property (nonatomic, assign) CGFloat radius; 54 | 55 | /** 56 | * 分支动画的结束值 57 | * 58 | * 默认值 0.57 59 | */ 60 | @property (nonatomic, assign) CGFloat toValue; 61 | 62 | /** 63 | * 以秒为单位的动画时间. 64 | * 65 | * 默认值 0.55 66 | */ 67 | @property (nonatomic, assign) NSTimeInterval animationDuration; 68 | 69 | - (void)animationDelay:(NSTimeInterval)delay 70 | completion:(XHBranchLayerAnimationCompletion)completion; 71 | 72 | @end 73 | -------------------------------------------------------------------------------- /XHTagView/Classes/Layers/XHBranchLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchLayer.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHBranchLayer.h" 10 | 11 | @interface XHBranchLayer () 12 | 13 | @property (nonatomic, copy) XHBranchLayerAnimationCompletion completion; 14 | 15 | @property (nonatomic, strong) CABasicAnimation *animation; 16 | 17 | @end 18 | 19 | @implementation XHBranchLayer 20 | 21 | - (instancetype)init { 22 | self = [super init]; 23 | if (self) { 24 | [self setup]; 25 | } 26 | return self; 27 | } 28 | 29 | - (void)dealloc { 30 | self.completion = nil; 31 | [self cancelPrevious]; 32 | } 33 | 34 | - (void)setup { 35 | self.strokeStart = 0; 36 | self.strokeEnd = 1; 37 | 38 | self.lineWidth = 1.0; 39 | 40 | self.toValue = 0.57; 41 | self.animationDuration = 0.55; 42 | 43 | self.strokeColor = [UIColor blackColor].CGColor; 44 | self.fillColor = [UIColor clearColor].CGColor; 45 | } 46 | 47 | - (void)commitPath { 48 | [CATransaction begin]; 49 | [CATransaction setDisableActions:YES]; 50 | self.path = nil; 51 | self.fillColor = [UIColor clearColor].CGColor; 52 | [CATransaction commit]; 53 | 54 | UIBezierPath *path = [UIBezierPath new]; 55 | [path moveToPoint:self.startPoint]; 56 | [path addLineToPoint:self.midPoint]; 57 | [path addLineToPoint:self.endPoint]; 58 | 59 | if (self.direction == XHBranchLayerDirectionRight) { 60 | CGPoint circlePoint = CGPointMake(self.endPoint.x + self.radius, self.endPoint.y); 61 | [path addArcWithCenter:circlePoint radius:self.radius startAngle:-M_PI endAngle:2 * M_PI / 2 clockwise:YES]; 62 | } else { 63 | CGPoint circlePoint = CGPointMake(self.endPoint.x - self.radius, self.endPoint.y); 64 | 65 | [path addArcWithCenter:circlePoint radius:self.radius startAngle:0 endAngle:2 * M_PI clockwise:YES]; 66 | } 67 | [path addLineToPoint:self.midPoint]; 68 | [path closePath]; 69 | 70 | self.strokeStart = 0.0; 71 | self.strokeEnd = 0.0; 72 | self.path = path.CGPath; 73 | } 74 | 75 | - (void)cancelPrevious { 76 | [NSObject cancelPreviousPerformRequestsWithTarget:self]; 77 | } 78 | 79 | - (void)animationDelay:(NSTimeInterval)delay 80 | completion:(XHBranchLayerAnimationCompletion)completion { 81 | [self removeAllAnimations]; 82 | [self cancelPrevious]; 83 | [self commitPath]; 84 | 85 | self.completion = completion; 86 | 87 | self.animation.beginTime = CACurrentMediaTime() + delay; 88 | [self addAnimation:self.animation forKey:@"strokeEnd"]; 89 | 90 | [self performSelector:@selector(setFillColor:) withObject:(id)[UIColor colorWithWhite:1.0 alpha:0.5].CGColor afterDelay:delay + self.animationDuration]; 91 | } 92 | 93 | - (CABasicAnimation *)animation { 94 | if (!_animation) { 95 | _animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 96 | _animation.delegate = self; 97 | _animation.fromValue = @(0); 98 | _animation.toValue = @(self.toValue); 99 | _animation.duration = self.animationDuration; 100 | _animation.fillMode = kCAFillModeForwards; 101 | _animation.removedOnCompletion = NO; 102 | } 103 | return _animation; 104 | } 105 | 106 | - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { 107 | if (self.completion) { 108 | self.completion(flag, self); 109 | } 110 | } 111 | 112 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Layers/XHFocusLayer.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHFocusLayer.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface XHFocusLayer : CAReplicatorLayer 13 | 14 | /** 15 | * 缩放动画开始的半径值 16 | * 17 | * 默认值 0.0 18 | */ 19 | @property (nonatomic, assign) CGFloat fromValueForRadius; 20 | 21 | /** 22 | * 透明动画开始的透明度值 23 | * 24 | * 默认值 0.45 25 | */ 26 | @property (nonatomic, assign) CGFloat fromValueForAlpha; 27 | 28 | /** 29 | * 关键帧动画中,透明度的中间值 30 | * 31 | * 默认值 0.2 32 | */ 33 | @property (nonatomic, assign) CGFloat keyTimeForHalfOpacity; 34 | 35 | /** 36 | * 脉冲动画的重复次数 37 | * 38 | * 默认值 INFINITY. 39 | */ 40 | @property (nonatomic, assign) float repeatCount; 41 | 42 | /** 43 | * 圆形脉冲的半径 44 | * 45 | * 默认值 15pt. 46 | */ 47 | @property (nonatomic, assign) CGFloat radius; 48 | 49 | /** 50 | * 以秒为单位的动画时间. 51 | * 52 | * 默认值 1.0 53 | */ 54 | @property (nonatomic, assign) NSTimeInterval animationDuration; 55 | 56 | /** 57 | * 圆形脉冲的个数 58 | * 59 | * 默认值 1 60 | */ 61 | @property (nonatomic, assign) NSInteger focusLayerNumber; 62 | 63 | - (void)startAnimation; 64 | - (void)stopAnimation; 65 | 66 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Layers/XHFocusLayer.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHFocusLayer.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHFocusLayer.h" 10 | 11 | @interface XHFocusLayer () 12 | 13 | @property (nonatomic, strong) CALayer *targetLayer; 14 | @property (nonatomic, strong) CAAnimationGroup *animationGroup; 15 | 16 | @end 17 | 18 | @implementation XHFocusLayer 19 | @dynamic repeatCount; 20 | 21 | - (instancetype)init { 22 | self = [super init]; 23 | if (self) { 24 | [self setupLayer]; 25 | 26 | [self setup]; 27 | } 28 | return self; 29 | } 30 | 31 | - (void)setup { 32 | _fromValueForRadius = 0.0; 33 | _fromValueForAlpha = 0.45; 34 | _keyTimeForHalfOpacity = 0.2; 35 | _animationDuration = 1.0; 36 | 37 | self.repeatCount = INFINITY; 38 | self.radius = 15; 39 | self.focusLayerNumber = 1; 40 | self.instanceDelay = 1; 41 | self.backgroundColor = [[UIColor whiteColor] CGColor]; 42 | 43 | [self stopAnimation]; 44 | } 45 | 46 | - (void)setupLayer { 47 | self.targetLayer = [CALayer new]; 48 | self.targetLayer.contentsScale = [UIScreen mainScreen].scale; 49 | self.targetLayer.opacity = 0; 50 | [self addSublayer:self.targetLayer]; 51 | } 52 | 53 | - (void)startAnimation { 54 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { 55 | 56 | if (!self.animationGroup) { 57 | CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; 58 | animationGroup.duration = self.animationDuration; 59 | animationGroup.repeatCount = self.repeatCount; 60 | animationGroup.removedOnCompletion = NO; 61 | 62 | CAMediaTimingFunction *defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]; 63 | animationGroup.timingFunction = defaultCurve; 64 | 65 | CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"]; 66 | scaleAnimation.fromValue = @(self.fromValueForRadius); 67 | scaleAnimation.toValue = @1.0; 68 | scaleAnimation.duration = self.animationDuration; 69 | 70 | CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; 71 | opacityAnimation.duration = self.animationDuration; 72 | opacityAnimation.values = @[@(self.fromValueForAlpha), @0.45, @0]; 73 | opacityAnimation.keyTimes = @[@0, @(self.keyTimeForHalfOpacity), @1]; 74 | opacityAnimation.removedOnCompletion = NO; 75 | 76 | NSArray *animations = @[scaleAnimation, opacityAnimation]; 77 | 78 | animationGroup.animations = animations; 79 | 80 | self.animationGroup = animationGroup; 81 | } 82 | 83 | dispatch_async(dispatch_get_main_queue(), ^(void) { 84 | self.opacity = 1.0; 85 | [self.targetLayer addAnimation:self.animationGroup forKey:@"focus"]; 86 | }); 87 | }); 88 | } 89 | 90 | - (void)stopAnimation { 91 | self.opacity = 0.0; 92 | [self.targetLayer removeAllAnimations]; 93 | } 94 | 95 | - (void)setBackgroundColor:(CGColorRef)backgroundColor { 96 | [super setBackgroundColor:backgroundColor]; 97 | self.targetLayer.backgroundColor = backgroundColor; 98 | } 99 | 100 | - (void)setRadius:(CGFloat)radius { 101 | _radius = radius; 102 | 103 | CGFloat diameter = self.radius * 2; 104 | 105 | self.targetLayer.bounds = CGRectMake(0, 0, diameter, diameter); 106 | self.targetLayer.cornerRadius = self.radius; 107 | } 108 | 109 | - (void)setFocusLayerNumber:(NSInteger)focusLayerNumber { 110 | _focusLayerNumber = focusLayerNumber; 111 | self.instanceCount = focusLayerNumber; 112 | self.instanceDelay = (self.animationDuration) / focusLayerNumber; 113 | } 114 | 115 | - (void)setAnimationDuration:(NSTimeInterval)animationDuration { 116 | _animationDuration = animationDuration; 117 | self.animationGroup.duration = animationDuration; 118 | for (CAAnimation *anAnimation in self.animationGroup.animations) { 119 | anAnimation.duration = animationDuration; 120 | } 121 | [self stopAnimation]; 122 | [self.targetLayer addAnimation:self.animationGroup forKey:@"focus"]; 123 | self.instanceDelay = (self.animationDuration) / self.focusLayerNumber; 124 | } 125 | 126 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Model/XHBranchPoint.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchPoint.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | #import "XHTagHeader.h" 13 | 14 | @interface XHBranchPoint : NSObject 15 | 16 | /** 17 | * 分支在动画中的朝向 18 | * 19 | * 默认是右边 20 | */ 21 | @property (nonatomic, assign) XHBranchLayerDirection direction; 22 | 23 | /** 24 | * 分支在动画的起始位置 25 | * 26 | * 默认值 CGPointZero 27 | */ 28 | @property (nonatomic, assign) CGPoint startPoint; 29 | 30 | /** 31 | * 分支在动画的中间位置 32 | * 33 | * 默认值 CGPointZero 34 | */ 35 | @property (nonatomic, assign) CGPoint midPoint; 36 | 37 | /** 38 | * 分支在动画的结束位置 39 | * 40 | * 默认值 CGPointZero 41 | */ 42 | @property (nonatomic, assign) CGPoint endPoint; 43 | 44 | + (instancetype)initlizerStartPoint:(CGPoint)startPoint 45 | midPoint:(CGPoint)midPoint 46 | endPoint:(CGPoint)endPoint 47 | direction:(XHBranchLayerDirection)direction; 48 | 49 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Model/XHBranchPoint.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchPoint.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHBranchPoint.h" 10 | 11 | @implementation XHBranchPoint 12 | 13 | + (instancetype)initlizerStartPoint:(CGPoint)startPoint 14 | midPoint:(CGPoint)midPoint 15 | endPoint:(CGPoint)endPoint 16 | direction:(XHBranchLayerDirection)direction { 17 | XHBranchPoint *branchPoint = [[XHBranchPoint alloc] init]; 18 | branchPoint.startPoint = startPoint; 19 | branchPoint.midPoint = midPoint; 20 | branchPoint.endPoint = endPoint; 21 | branchPoint.direction = direction; 22 | return branchPoint; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHBranchTextView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchTextView.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | #import "XHTagHeader.h" 11 | 12 | @interface XHBranchTextView : UIView 13 | 14 | /** 15 | * 分支提示文本 16 | */ 17 | @property (nonatomic, copy) NSString *branchText; 18 | 19 | - (void)showInPoint:(CGPoint)point direction:(XHBranchLayerDirection)direction; 20 | - (void)dismiss; 21 | 22 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHBranchTextView.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHBranchTextView.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHBranchTextView.h" 10 | 11 | @interface XHBranchTextView () 12 | 13 | @property (nonatomic, strong) UILabel *textLabel; 14 | @property (nonatomic, strong) UIImageView *arrowImageView; 15 | 16 | @end 17 | 18 | @implementation XHBranchTextView 19 | 20 | - (instancetype)initWithFrame:(CGRect)frame { 21 | self = [super initWithFrame:frame]; 22 | if (self) { 23 | [self setup]; 24 | } 25 | return self; 26 | } 27 | 28 | - (void)awakeFromNib { 29 | [self setup]; 30 | } 31 | 32 | - (void)setup { 33 | [self addSubview:self.arrowImageView]; 34 | [self addSubview:self.textLabel]; 35 | 36 | [self dismiss]; 37 | } 38 | 39 | - (void)showInPoint:(CGPoint)point direction:(XHBranchLayerDirection)direction { 40 | [self.textLabel sizeToFit]; 41 | 42 | CGFloat width = CGRectGetWidth(self.textLabel.bounds) + 20; 43 | CGFloat height = 24; 44 | 45 | CGRect frame = CGRectMake(point.x - width - 8, point.y - height / 2.0, width, 24); 46 | 47 | if (direction == XHBranchLayerDirectionRight) { 48 | frame = CGRectMake(point.x + 8, point.y - height / 2.0, width, 24); 49 | } 50 | 51 | if (!self.textLabel.text.length) { 52 | frame.size = CGSizeZero; 53 | } 54 | 55 | self.textLabel.center = CGPointMake(CGRectGetWidth(frame) / 2.0, CGRectGetHeight(frame) / 2.0); 56 | 57 | [self setupArrowImageWithDirection:direction]; 58 | self.frame = frame; 59 | self.arrowImageView.frame = self.bounds; 60 | 61 | 62 | self.alpha = 0.0; 63 | [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 64 | self.alpha = 1.0; 65 | } completion:^(BOOL finished) { 66 | 67 | }]; 68 | } 69 | 70 | - (void)dismiss { 71 | self.alpha = 0.0; 72 | } 73 | 74 | - (void)animation { 75 | CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 76 | opacityAnimation.duration = 0.35; 77 | opacityAnimation.fromValue = @(0.0); 78 | opacityAnimation.toValue = @(1.0); 79 | opacityAnimation.removedOnCompletion = NO; 80 | [self.layer addAnimation:opacityAnimation forKey:@"opacityAnimation"]; 81 | } 82 | 83 | - (UILabel *)textLabel { 84 | if (!_textLabel) { 85 | _textLabel = [UILabel new]; 86 | _textLabel.numberOfLines = 1.0; 87 | _textLabel.font = [UIFont systemFontOfSize:11]; 88 | _textLabel.textColor = [UIColor whiteColor]; 89 | } 90 | return _textLabel; 91 | } 92 | 93 | - (UIImageView *)arrowImageView { 94 | if (!_arrowImageView) { 95 | _arrowImageView = [[UIImageView alloc] init]; 96 | } 97 | return _arrowImageView; 98 | } 99 | 100 | - (void)setBranchText:(NSString *)branchText { 101 | _branchText = branchText; 102 | self.textLabel.text = branchText; 103 | } 104 | 105 | - (void)setupArrowImageWithDirection:(XHBranchLayerDirection)direction { 106 | self.arrowImageView.image = [[UIImage imageNamed:(direction == XHBranchLayerDirectionRight ? @"tag-background-right" : @"tag-background-left")] resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10) resizingMode:UIImageResizingModeStretch]; 107 | } 108 | 109 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHCenterView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHCenterView.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XHCenterView : UIView 12 | 13 | /** 14 | * 中心红点的按钮 15 | */ 16 | @property (nonatomic, strong) UIButton *button; 17 | 18 | - (void)show; 19 | - (void)dismiss; 20 | 21 | - (void)startAnimation; 22 | - (void)stopAnimation; 23 | 24 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHCenterView.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHCenterView.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHCenterView.h" 10 | #import "XHFocusLayer.h" 11 | 12 | @interface XHCenterView () 13 | 14 | @property (nonatomic, strong) XHFocusLayer *focusLayer; 15 | 16 | @end 17 | 18 | @implementation XHCenterView 19 | 20 | - (instancetype)initWithFrame:(CGRect)frame { 21 | self = [super initWithFrame:frame]; 22 | if (self) { 23 | [self setup]; 24 | } 25 | return self; 26 | } 27 | 28 | - (void)awakeFromNib { 29 | [self setup]; 30 | } 31 | 32 | - (void)setup { 33 | [self.layer addSublayer:self.focusLayer]; 34 | [self addSubview:self.button]; 35 | } 36 | 37 | - (void)layoutSubviews { 38 | [super layoutSubviews]; 39 | self.button.frame = self.bounds; 40 | } 41 | 42 | - (void)show { 43 | self.alpha = 1.0; 44 | } 45 | 46 | - (void)dismiss { 47 | self.alpha = 0.0; 48 | } 49 | 50 | - (void)startAnimation { 51 | [self.focusLayer startAnimation]; 52 | } 53 | 54 | - (void)stopAnimation { 55 | [self.focusLayer stopAnimation]; 56 | } 57 | 58 | #pragma mark - Propertys 59 | 60 | - (XHFocusLayer *)focusLayer { 61 | if (!_focusLayer) { 62 | _focusLayer = [XHFocusLayer new]; 63 | _focusLayer.fromValueForRadius = 0.35; 64 | _focusLayer.position = [self tagCenterPoint]; 65 | } 66 | return _focusLayer; 67 | } 68 | 69 | - (UIButton *)button { 70 | if (!_button) { 71 | _button = [UIButton buttonWithType:UIButtonTypeCustom]; 72 | [_button setBackgroundImage:[UIImage imageNamed:@"tag-center"] forState:UIControlStateNormal]; 73 | } 74 | return _button; 75 | } 76 | 77 | - (CGPoint)tagCenterPoint { 78 | CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 79 | return center; 80 | } 81 | 82 | @end 83 | 84 | 85 | /* 86 | - (CAShapeLayer *)centerLayer { 87 | if (!_centerLayer) { 88 | UIBezierPath *path = [UIBezierPath new]; 89 | [path addArcWithCenter:[self tagCenterPoint] radius:self.centerRadius startAngle:0 endAngle:2 * M_PI clockwise:YES]; 90 | _centerLayer = [CAShapeLayer new]; 91 | _centerLayer.path = path.CGPath; 92 | _centerLayer.lineWidth = 2.0; 93 | _centerLayer.strokeColor = [UIColor whiteColor].CGColor; 94 | _centerLayer.fillColor = [UIColor redColor].CGColor; 95 | } 96 | return _centerLayer; 97 | } 98 | */ -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHTagView.h: -------------------------------------------------------------------------------- 1 | // 2 | // XHTagView.h 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XHTagView : UIView 12 | 13 | /** 14 | * 分支动画末梢圆圈的半径 15 | * 16 | * 默认值 3.0 17 | */ 18 | @property (nonatomic, assign) CGFloat radius; 19 | 20 | /** 21 | * 获取标签视图是否显示,仅仅用于获取,不能赋值 22 | */ 23 | @property (nonatomic, assign, readonly) BOOL showing; 24 | 25 | /** 26 | * 是否支持手势滑动TagView,默认是YES 27 | */ 28 | @property (nonatomic, assign) BOOL panGestureOnTagViewed; 29 | 30 | /** 31 | * 标签分支的文本,总共三个 32 | */ 33 | @property (nonatomic, strong) NSArray *branchTexts; 34 | 35 | - (void)showInPoint:(CGPoint)point; 36 | - (void)dismiss; 37 | 38 | @end -------------------------------------------------------------------------------- /XHTagView/Classes/Views/XHTagView.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHTagView.m 3 | // XHTagView 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "XHTagView.h" 10 | 11 | #import "XHBranchLayer.h" 12 | #import "XHCenterView.h" 13 | #import "XHBranchTextView.h" 14 | #import "XHBranchPoint.h" 15 | 16 | #import "XHTagHeader.h" 17 | 18 | @interface XHTagView () 19 | 20 | @property (nonatomic, assign, readwrite) BOOL showing; 21 | 22 | @property (nonatomic, strong) XHBranchLayer *topBranchLayer; 23 | @property (nonatomic, strong) XHBranchLayer *midBranchLayer; 24 | @property (nonatomic, strong) XHBranchLayer *bottomBranchLayer; 25 | 26 | @property (nonatomic, strong) XHBranchTextView *topBranchTextView; 27 | @property (nonatomic, strong) XHBranchTextView *midBranchTextView; 28 | @property (nonatomic, strong) XHBranchTextView *bottomBranchTextView; 29 | 30 | @property (nonatomic, strong) XHCenterView *centerView; 31 | 32 | @property (nonatomic, assign) XHTagAnimationStyle tagAnimationStyle; 33 | @property (nonatomic, strong) NSMutableArray *branchPoints; 34 | 35 | @property (nonatomic, strong) UIPanGestureRecognizer *panGestureRecognizer; 36 | 37 | // C6 3的组合,有4种可能是我们想要的 38 | 39 | @end 40 | 41 | @implementation XHTagView 42 | 43 | - (instancetype)initWithFrame:(CGRect)frame { 44 | self = [super initWithFrame:frame]; 45 | if (self) { 46 | [self setup]; 47 | } 48 | return self; 49 | } 50 | 51 | - (void)awakeFromNib { 52 | [self setup]; 53 | } 54 | 55 | - (void)setup { 56 | self.radius = 3; 57 | self.panGestureOnTagViewed = YES; 58 | 59 | [self.layer addSublayer:self.topBranchLayer]; 60 | [self.layer addSublayer:self.midBranchLayer]; 61 | [self.layer addSublayer:self.bottomBranchLayer]; 62 | 63 | [self addSubview:self.topBranchTextView]; 64 | [self addSubview:self.midBranchTextView]; 65 | [self addSubview:self.bottomBranchTextView]; 66 | 67 | [self addSubview:self.centerView]; 68 | } 69 | 70 | - (void)showInPoint:(CGPoint)point { 71 | // 带有脉冲的中心点位置 72 | self.center = point; 73 | 74 | CGPoint center = [self tagCenterPoint]; 75 | 76 | [self.centerView show]; 77 | self.centerView.alpha = 1.0; 78 | self.centerView.center = center; 79 | 80 | self.tagAnimationStyle = XHTagAnimationStyleDoubleRight; 81 | [self animation]; 82 | } 83 | 84 | - (void)dismiss { 85 | [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 86 | self.alpha = 0.0; 87 | } completion:^(BOOL finished) { 88 | self.showing = NO; 89 | }]; 90 | } 91 | 92 | - (void)animation { 93 | switch (self.tagAnimationStyle) { 94 | case XHTagAnimationStyleAllLeft: { 95 | [self setupBranchLayer:self.topBranchLayer branchPoint:self.branchPoints[2]]; 96 | [self setupBranchLayer:self.midBranchLayer branchPoint:self.branchPoints[1]]; 97 | [self setupBranchLayer:self.bottomBranchLayer branchPoint:self.branchPoints[0]]; 98 | break; 99 | } 100 | case XHTagAnimationStyleAllRight: { 101 | [self setupBranchLayer:self.topBranchLayer branchPoint:self.branchPoints[5]]; 102 | [self setupBranchLayer:self.midBranchLayer branchPoint:self.branchPoints[4]]; 103 | [self setupBranchLayer:self.bottomBranchLayer branchPoint:self.branchPoints[3]]; 104 | break; 105 | } 106 | case XHTagAnimationStyleDoubleLeft: { 107 | [self setupBranchLayer:self.topBranchLayer branchPoint:self.branchPoints[2]]; 108 | [self setupBranchLayer:self.midBranchLayer branchPoint:self.branchPoints[4]]; 109 | [self setupBranchLayer:self.bottomBranchLayer branchPoint:self.branchPoints[0]]; 110 | break; 111 | } 112 | case XHTagAnimationStyleDoubleRight: { 113 | [self setupBranchLayer:self.topBranchLayer branchPoint:self.branchPoints[5]]; 114 | [self setupBranchLayer:self.midBranchLayer branchPoint:self.branchPoints[1]]; 115 | [self setupBranchLayer:self.bottomBranchLayer branchPoint:self.branchPoints[3]]; 116 | break; 117 | } 118 | default: 119 | break; 120 | } 121 | 122 | [self.centerView stopAnimation]; 123 | [self.topBranchTextView dismiss]; 124 | [self.midBranchTextView dismiss]; 125 | [self.bottomBranchTextView dismiss]; 126 | 127 | __weak typeof(self) weakSelf = self; 128 | [self.topBranchLayer animationDelay:0.0 completion:^(BOOL finished, XHBranchLayer *branchLayer) { 129 | if (finished) { 130 | [weakSelf.topBranchTextView showInPoint:branchLayer.endPoint direction:branchLayer.direction]; 131 | [weakSelf.centerView startAnimation]; 132 | } 133 | }]; 134 | [self.midBranchLayer animationDelay:0.0 completion:^(BOOL finished, XHBranchLayer *branchLayer) { 135 | if (finished) { 136 | [weakSelf.midBranchTextView showInPoint:branchLayer.endPoint direction:branchLayer.direction]; 137 | } 138 | }]; 139 | [self.bottomBranchLayer animationDelay:0.0 completion:^(BOOL finished, XHBranchLayer *branchLayer) { 140 | if (finished) { 141 | [weakSelf.bottomBranchTextView showInPoint:branchLayer.endPoint direction:branchLayer.direction]; 142 | } 143 | }]; 144 | } 145 | 146 | - (void)centerButtonClick:(UIButton *)sender { 147 | if (self.tagAnimationStyle == XHTagAnimationStyleAllLeft) { 148 | self.tagAnimationStyle = XHTagAnimationStyleAllRight; 149 | } else if (self.tagAnimationStyle == XHTagAnimationStyleAllRight) { 150 | self.tagAnimationStyle = XHTagAnimationStyleDoubleLeft; 151 | } else if (self.tagAnimationStyle == XHTagAnimationStyleDoubleLeft) { 152 | self.tagAnimationStyle = XHTagAnimationStyleDoubleRight; 153 | } else if (self.tagAnimationStyle == XHTagAnimationStyleDoubleRight) { 154 | self.tagAnimationStyle = XHTagAnimationStyleAllLeft; 155 | } else if (self.tagAnimationStyle == XHTagAnimationStyleAllLeft) { 156 | self.tagAnimationStyle = XHTagAnimationStyleAllRight; 157 | } 158 | [self animation]; 159 | } 160 | 161 | - (void)setupBranchLayer:(XHBranchLayer *)branchLayer branchPoint:(XHBranchPoint *)branchPoint { 162 | [self setupBranchLayer:branchLayer 163 | startPoint:branchPoint.startPoint 164 | midPoint:branchPoint.midPoint 165 | endPoint:branchPoint.endPoint 166 | direction:branchPoint.direction]; 167 | } 168 | 169 | - (void)setupBranchLayer:(XHBranchLayer *)branchLayer startPoint:(CGPoint)startPoint midPoint:(CGPoint)midPoint endPoint:(CGPoint)endPoint direction:(XHBranchLayerDirection)direction { 170 | branchLayer.startPoint = startPoint; 171 | branchLayer.direction = direction; 172 | branchLayer.midPoint = midPoint; 173 | branchLayer.endPoint = endPoint; 174 | branchLayer.radius = self.radius; 175 | } 176 | 177 | #pragma mark - Gesture Handles 178 | 179 | - (void)handlePanGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer { 180 | CGPoint point = [panGestureRecognizer translationInView:panGestureRecognizer.view]; 181 | 182 | self.center = CGPointMake(self.center.x + point.x, self.center.y + point.y); 183 | 184 | [panGestureRecognizer setTranslation:CGPointZero inView:panGestureRecognizer.view]; 185 | } 186 | 187 | #pragma mark - Propertys 188 | 189 | - (void)setPanGestureOnTagViewed:(BOOL)panGestureOnTagViewed { 190 | _panGestureOnTagViewed = panGestureOnTagViewed; 191 | if (panGestureOnTagViewed) { 192 | if (![self validatePanGesture]) { 193 | [self addGestureRecognizer:self.panGestureRecognizer]; 194 | } 195 | } else { 196 | if ([self validatePanGesture]) { 197 | [self removeGestureRecognizer:self.panGestureRecognizer]; 198 | } 199 | } 200 | } 201 | 202 | - (BOOL)validatePanGesture { 203 | return [self.gestureRecognizers containsObject:self.panGestureRecognizer]; 204 | } 205 | 206 | - (XHBranchLayer *)topBranchLayer { 207 | if (!_topBranchLayer) { 208 | _topBranchLayer = [XHBranchLayer new]; 209 | } 210 | return _topBranchLayer; 211 | } 212 | 213 | - (XHBranchLayer *)midBranchLayer { 214 | if (!_midBranchLayer) { 215 | _midBranchLayer = [XHBranchLayer new]; 216 | _midBranchLayer.toValue = 0.62; 217 | } 218 | return _midBranchLayer; 219 | } 220 | 221 | - (XHBranchLayer *)bottomBranchLayer { 222 | if (!_bottomBranchLayer) { 223 | _bottomBranchLayer = [XHBranchLayer new]; 224 | } 225 | return _bottomBranchLayer; 226 | } 227 | 228 | - (XHBranchTextView *)topBranchTextView { 229 | if (!_topBranchTextView) { 230 | _topBranchTextView = [[XHBranchTextView alloc] initWithFrame:CGRectZero]; 231 | } 232 | return _topBranchTextView; 233 | } 234 | 235 | - (XHBranchTextView *)midBranchTextView { 236 | if (!_midBranchTextView) { 237 | _midBranchTextView = [[XHBranchTextView alloc] initWithFrame:CGRectZero]; 238 | } 239 | return _midBranchTextView; 240 | } 241 | 242 | - (XHBranchTextView *)bottomBranchTextView { 243 | if (!_bottomBranchTextView) { 244 | _bottomBranchTextView = [[XHBranchTextView alloc] initWithFrame:CGRectZero]; 245 | } 246 | return _bottomBranchTextView; 247 | } 248 | 249 | - (XHCenterView *)centerView { 250 | if (!_centerView) { 251 | _centerView = [[XHCenterView alloc] initWithFrame:CGRectMake(0, 0, 13, 13)]; 252 | _centerView.alpha = 0.0; 253 | _centerView.center = [self tagCenterPoint]; 254 | [_centerView.button addTarget:self action:@selector(centerButtonClick:) forControlEvents:UIControlEventTouchUpInside]; 255 | } 256 | return _centerView; 257 | } 258 | 259 | - (NSMutableArray *)branchPoints { 260 | if (!_branchPoints) { 261 | _branchPoints = [[NSMutableArray alloc] init]; 262 | 263 | CGPoint center = [self tagCenterPoint]; 264 | 265 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 266 | midPoint:CGPointMake(center.x - 20, center.y + 35) 267 | endPoint:CGPointMake(center.x - 40, center.y + 35) 268 | direction:XHBranchLayerDirectionLeft]]; 269 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 270 | midPoint:CGPointMake(center.x - 10, center.y) 271 | endPoint:CGPointMake(center.x - 30, center.y) 272 | direction:XHBranchLayerDirectionLeft]]; 273 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 274 | midPoint:CGPointMake(center.x - 20, center.y - 35) 275 | endPoint:CGPointMake(center.x - 40, center.y - 35) 276 | direction:XHBranchLayerDirectionLeft]]; 277 | 278 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 279 | midPoint:CGPointMake(center.x + 20, center.y + 35) 280 | endPoint:CGPointMake(center.x + 40, center.y + 35) 281 | direction:XHBranchLayerDirectionRight]]; 282 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 283 | midPoint:CGPointMake(center.x + 10, center.y) 284 | endPoint:CGPointMake(center.x + 30, center.y) 285 | direction:XHBranchLayerDirectionRight]]; 286 | [_branchPoints addObject:[XHBranchPoint initlizerStartPoint:center 287 | midPoint:CGPointMake(center.x + 20, center.y - 35) 288 | endPoint:CGPointMake(center.x + 40, center.y - 35) 289 | direction:XHBranchLayerDirectionRight]]; 290 | } 291 | return _branchPoints; 292 | } 293 | 294 | - (void)setBranchTexts:(NSArray *)branchTexts { 295 | if (_branchTexts == branchTexts) { 296 | return; 297 | } 298 | _branchTexts = branchTexts; 299 | _topBranchTextView.branchText = [self.branchTexts firstObject]; 300 | _midBranchTextView.branchText = (self.branchTexts.count > 1 ? self.branchTexts[1] : @""); 301 | _bottomBranchTextView.branchText = [self.branchTexts lastObject]; 302 | } 303 | 304 | - (UIPanGestureRecognizer *)panGestureRecognizer { 305 | if (!_panGestureRecognizer) { 306 | _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestureRecognizer:)]; 307 | } 308 | return _panGestureRecognizer; 309 | } 310 | 311 | - (NSArray *)initlizerTagAnimationBranchWithTopBranchPoint:(XHBranchPoint *)topBranchPoint 312 | midBranchPoint:(XHBranchPoint *)midBranchPoint 313 | endBranchPoint:(XHBranchPoint *)endBranchPoint { 314 | NSArray *tagAnimationBranch = @[topBranchPoint, midBranchPoint, endBranchPoint]; 315 | return tagAnimationBranch; 316 | } 317 | 318 | 319 | - (CGPoint)tagCenterPoint { 320 | CGPoint center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 321 | return center; 322 | } 323 | 324 | @end -------------------------------------------------------------------------------- /XHTagView/Resources/tag-background-left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-background-left@2x.png -------------------------------------------------------------------------------- /XHTagView/Resources/tag-background-left@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-background-left@3x.png -------------------------------------------------------------------------------- /XHTagView/Resources/tag-background-right@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-background-right@2x.png -------------------------------------------------------------------------------- /XHTagView/Resources/tag-background-right@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-background-right@3x.png -------------------------------------------------------------------------------- /XHTagView/Resources/tag-center@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-center@2x.png -------------------------------------------------------------------------------- /XHTagView/Resources/tag-center@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagView/Resources/tag-center@3x.png -------------------------------------------------------------------------------- /XHTagViewDemo/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '8.0' 3 | # Uncomment this line if you're using Swift 4 | # use_frameworks! 5 | 6 | target 'XHTagViewDemo' do 7 | 8 | pod 'XHTagView', :local => "../" 9 | 10 | end 11 | 12 | target 'XHTagViewDemoTests' do 13 | 14 | end 15 | 16 | target 'XHTagViewDemoUITests' do 17 | 18 | end 19 | 20 | -------------------------------------------------------------------------------- /XHTagViewDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - XHTagView (1.0) 3 | 4 | DEPENDENCIES: 5 | - XHTagView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | XHTagView: 9 | :local: "../" 10 | 11 | SPEC CHECKSUMS: 12 | XHTagView: 1df29bdf1b2116986909cdf2f2e4d64e91055ad6 13 | 14 | COCOAPODS: 0.39.0 15 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHBranchLayer.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Layers/XHBranchLayer.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHBranchPoint.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Model/XHBranchPoint.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHBranchTextView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHBranchTextView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHCenterView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHCenterView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHFocusLayer.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Layers/XHFocusLayer.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHTagHeader.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Header/XHTagHeader.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Private/XHTagView/XHTagView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHTagView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHBranchLayer.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Layers/XHBranchLayer.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHBranchPoint.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Model/XHBranchPoint.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHBranchTextView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHBranchTextView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHCenterView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHCenterView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHFocusLayer.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Layers/XHFocusLayer.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHTagHeader.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Header/XHTagHeader.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Headers/Public/XHTagView/XHTagView.h: -------------------------------------------------------------------------------- 1 | ../../../../../XHTagView/Classes/Views/XHTagView.h -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Local Podspecs/XHTagView.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "XHTagView", 3 | "version": "1.0", 4 | "summary": "High efficiency Tag components.", 5 | "homepage": "https://github.com/xhzengAIB/TagView", 6 | "license": "MIT", 7 | "authors": { 8 | "Jack": "xhzengAIB@gmail.com" 9 | }, 10 | "source": { 11 | "git": "https://github.com/xhzengAIB/TagView.git", 12 | "tag": "1.0" 13 | }, 14 | "frameworks": [ 15 | "Foundation", 16 | "UIKit" 17 | ], 18 | "platforms": { 19 | "ios": "7.0" 20 | }, 21 | "source_files": "XHTagView/Classes/**/*.{h,m}", 22 | "resources": "XHTagView/Resources/*", 23 | "requires_arc": true 24 | } 25 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - XHTagView (1.0) 3 | 4 | DEPENDENCIES: 5 | - XHTagView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | XHTagView: 9 | :local: "../" 10 | 11 | SPEC CHECKSUMS: 12 | XHTagView: 1df29bdf1b2116986909cdf2f2e4d64e91055ad6 13 | 14 | COCOAPODS: 0.39.0 15 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 16E83D270A72810DB45D6B0DED7DEA23 /* XHCenterView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E3EAD7AE8563F051DE953501CDD9D87 /* XHCenterView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 39D981D67A66D2F58370527BD522E6DB /* XHCenterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 985DAB0BFB63207D6125BC86FE40DF8F /* XHCenterView.m */; }; 12 | 46653D30A92B881FF4C853DF89141886 /* XHBranchPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 28990FE0386D846E135099E74332EB20 /* XHBranchPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 4C2B92036E3BF2F99DA8F1A207BE881F /* Pods-XHTagViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE352EA278DFC0EBEE2EA324C8D1FDE7 /* Pods-XHTagViewDemo-dummy.m */; }; 14 | 4CD03CFF76EA37A47001BFFC92781281 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3B7BDF5CE5CB8F095FE12DA55D9A9BB /* UIKit.framework */; }; 15 | 6094C234DA03FDE8516DEFCD9414F58F /* XHFocusLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EF65D58F26E83CC142F95CD5FABEA32 /* XHFocusLayer.m */; }; 16 | 71168E2FAB352CE1E6FBE2120FB01D53 /* XHFocusLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = FCE82B46159B2EEA4BBC587E66E3E1D2 /* XHFocusLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 17 | A69C1ECB0CF712BD8269230A2053FEC4 /* XHBranchPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E70DD18498B23AE5E8F8B5FE3AB713B /* XHBranchPoint.m */; }; 18 | B0D5E609A2D5C9E4F494C2130B20BE67 /* XHTagHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 884ADAEE48F0DD66B0A32230217BE3CA /* XHTagHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 19 | B4DE555FB6113F9B51F10CFBBA01831D /* XHTagView.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AFD901470651BE4A01B1F16E5A16FD6 /* XHTagView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | B7D8CE48AB96C2AADA21B787BDCF1064 /* XHTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 32655558443C942D3737B6F39036E95E /* XHTagView.m */; }; 21 | C6E171F92D5B9352EC3A7B39C9E8D758 /* XHBranchTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 54166236D1BF933A38EAB64302624195 /* XHBranchTextView.m */; }; 22 | D31DDA66849103091860F87FA2C44915 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E7E5AF37923BFA48D6994B9BFC6535F /* Foundation.framework */; }; 23 | DA080FC8879DE59D8C4150B5B7AB3A33 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6E7E5AF37923BFA48D6994B9BFC6535F /* Foundation.framework */; }; 24 | E3B10C227F1ACCA02B0CD666BDC61A97 /* XHBranchLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D5648408D8E7CD38C5BC1DCB70712E4 /* XHBranchLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | EDA780E0A12D568967642ABC8EBE73A4 /* XHTagView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA1F25F26FAEF0FFA10FBAEA048E1DB7 /* XHTagView-dummy.m */; }; 26 | F778DE189A93ACC0E6745EE356705621 /* XHBranchLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = B38DF4B33BCC740D7F3F0A09F0CFEB35 /* XHBranchLayer.m */; }; 27 | F8966A257611B5B0C97FEC72BBFDA1B8 /* XHBranchTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DF0BB251DFE8A6FBC015CC614E7DBE6 /* XHBranchTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 859A486A2480ED444B423FAA8E4D3F1A /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 0B8DE216554E927FAC9BB85196CDC28A; 36 | remoteInfo = XHTagView; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 043E10622BF7B0578B79893E63627BC4 /* Pods-XHTagViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XHTagViewDemo.debug.xcconfig"; sourceTree = ""; }; 42 | 15E321AE4C07048F76A67F78BE75D402 /* tag-background-right@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-background-right@2x.png"; sourceTree = ""; }; 43 | 1AFD901470651BE4A01B1F16E5A16FD6 /* XHTagView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHTagView.h; sourceTree = ""; }; 44 | 1E3EAD7AE8563F051DE953501CDD9D87 /* XHCenterView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHCenterView.h; sourceTree = ""; }; 45 | 1E444D5ABB748136278D83A995F6D686 /* Pods-XHTagViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XHTagViewDemo-frameworks.sh"; sourceTree = ""; }; 46 | 2483AFD2DE40C600B21214FC2B8EB38E /* Pods-XHTagViewDemo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-XHTagViewDemo-resources.sh"; sourceTree = ""; }; 47 | 28990FE0386D846E135099E74332EB20 /* XHBranchPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHBranchPoint.h; sourceTree = ""; }; 48 | 2EF65D58F26E83CC142F95CD5FABEA32 /* XHFocusLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHFocusLayer.m; sourceTree = ""; }; 49 | 3191542BE5C0C2C33CEE7F429CB23939 /* libPods-XHTagViewDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XHTagViewDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 32655558443C942D3737B6F39036E95E /* XHTagView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHTagView.m; sourceTree = ""; }; 51 | 3D5648408D8E7CD38C5BC1DCB70712E4 /* XHBranchLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHBranchLayer.h; sourceTree = ""; }; 52 | 54166236D1BF933A38EAB64302624195 /* XHBranchTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHBranchTextView.m; sourceTree = ""; }; 53 | 5FE6549CE15F27E236E35FF46CBCE457 /* tag-center@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-center@3x.png"; sourceTree = ""; }; 54 | 65A555A8BD8FA5EA9632637215FA2195 /* Pods-XHTagViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-XHTagViewDemo-acknowledgements.plist"; sourceTree = ""; }; 55 | 6E7E5AF37923BFA48D6994B9BFC6535F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 56 | 709C3E080A8BDEA8710F2C9DD63A50CC /* Pods-XHTagViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-XHTagViewDemo-acknowledgements.markdown"; sourceTree = ""; }; 57 | 7A23366509DEE4E8C75CA4CD8C41118B /* XHTagView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "XHTagView-prefix.pch"; sourceTree = ""; }; 58 | 83D700B4F586ECAF7E9D82725D8C1078 /* tag-background-right@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-background-right@3x.png"; sourceTree = ""; }; 59 | 884ADAEE48F0DD66B0A32230217BE3CA /* XHTagHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHTagHeader.h; sourceTree = ""; }; 60 | 8B14BF15945E0215C43F36D35757A6BC /* libXHTagView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libXHTagView.a; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | 8C0C34D9CC79908345059E05DBB950BB /* XHTagView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = XHTagView.xcconfig; sourceTree = ""; }; 62 | 8DF0BB251DFE8A6FBC015CC614E7DBE6 /* XHBranchTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHBranchTextView.h; sourceTree = ""; }; 63 | 985DAB0BFB63207D6125BC86FE40DF8F /* XHCenterView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHCenterView.m; sourceTree = ""; }; 64 | 9E70DD18498B23AE5E8F8B5FE3AB713B /* XHBranchPoint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHBranchPoint.m; sourceTree = ""; }; 65 | B2A7B3FBEE218ADC779A615F30080B70 /* Pods-XHTagViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-XHTagViewDemo.release.xcconfig"; sourceTree = ""; }; 66 | B38DF4B33BCC740D7F3F0A09F0CFEB35 /* XHBranchLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = XHBranchLayer.m; sourceTree = ""; }; 67 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 68 | BE352EA278DFC0EBEE2EA324C8D1FDE7 /* Pods-XHTagViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-XHTagViewDemo-dummy.m"; sourceTree = ""; }; 69 | C3B7BDF5CE5CB8F095FE12DA55D9A9BB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 70 | CA2985879433CA85B1D85D0F49C3C29F /* tag-background-left@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-background-left@3x.png"; sourceTree = ""; }; 71 | DA1F25F26FAEF0FFA10FBAEA048E1DB7 /* XHTagView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "XHTagView-dummy.m"; sourceTree = ""; }; 72 | E6A6B984F45A6D841998CBF8C9168AAD /* tag-background-left@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-background-left@2x.png"; sourceTree = ""; }; 73 | E8451B29348BC3CC4504E8E41D11181C /* tag-center@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; path = "tag-center@2x.png"; sourceTree = ""; }; 74 | FCE82B46159B2EEA4BBC587E66E3E1D2 /* XHFocusLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = XHFocusLayer.h; sourceTree = ""; }; 75 | /* End PBXFileReference section */ 76 | 77 | /* Begin PBXFrameworksBuildPhase section */ 78 | 3647EE74FE3CA80823B9A521B7F3511A /* Frameworks */ = { 79 | isa = PBXFrameworksBuildPhase; 80 | buildActionMask = 2147483647; 81 | files = ( 82 | DA080FC8879DE59D8C4150B5B7AB3A33 /* Foundation.framework in Frameworks */, 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | 5D4276F3358B6AAD8341C60D6DD69D64 /* Frameworks */ = { 87 | isa = PBXFrameworksBuildPhase; 88 | buildActionMask = 2147483647; 89 | files = ( 90 | D31DDA66849103091860F87FA2C44915 /* Foundation.framework in Frameworks */, 91 | 4CD03CFF76EA37A47001BFFC92781281 /* UIKit.framework in Frameworks */, 92 | ); 93 | runOnlyForDeploymentPostprocessing = 0; 94 | }; 95 | /* End PBXFrameworksBuildPhase section */ 96 | 97 | /* Begin PBXGroup section */ 98 | 18340F12838DEE43507667CC74401EB1 /* iOS */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 6E7E5AF37923BFA48D6994B9BFC6535F /* Foundation.framework */, 102 | C3B7BDF5CE5CB8F095FE12DA55D9A9BB /* UIKit.framework */, 103 | ); 104 | name = iOS; 105 | sourceTree = ""; 106 | }; 107 | 28A3C7621E2AD496D3E24C4D2A13EB07 /* Header */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 884ADAEE48F0DD66B0A32230217BE3CA /* XHTagHeader.h */, 111 | ); 112 | path = Header; 113 | sourceTree = ""; 114 | }; 115 | 338BB462567CE0EBD9FCBAB76E286F66 /* Products */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | 3191542BE5C0C2C33CEE7F429CB23939 /* libPods-XHTagViewDemo.a */, 119 | 8B14BF15945E0215C43F36D35757A6BC /* libXHTagView.a */, 120 | ); 121 | name = Products; 122 | sourceTree = ""; 123 | }; 124 | 3A00786E6DD0622B4CFFE1A49FA0BA1D /* Layers */ = { 125 | isa = PBXGroup; 126 | children = ( 127 | 3D5648408D8E7CD38C5BC1DCB70712E4 /* XHBranchLayer.h */, 128 | B38DF4B33BCC740D7F3F0A09F0CFEB35 /* XHBranchLayer.m */, 129 | FCE82B46159B2EEA4BBC587E66E3E1D2 /* XHFocusLayer.h */, 130 | 2EF65D58F26E83CC142F95CD5FABEA32 /* XHFocusLayer.m */, 131 | ); 132 | path = Layers; 133 | sourceTree = ""; 134 | }; 135 | 3B0138F845A78A7E5F3C219DEB9A2F53 /* Resources */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | E6A6B984F45A6D841998CBF8C9168AAD /* tag-background-left@2x.png */, 139 | CA2985879433CA85B1D85D0F49C3C29F /* tag-background-left@3x.png */, 140 | 15E321AE4C07048F76A67F78BE75D402 /* tag-background-right@2x.png */, 141 | 83D700B4F586ECAF7E9D82725D8C1078 /* tag-background-right@3x.png */, 142 | E8451B29348BC3CC4504E8E41D11181C /* tag-center@2x.png */, 143 | 5FE6549CE15F27E236E35FF46CBCE457 /* tag-center@3x.png */, 144 | ); 145 | path = Resources; 146 | sourceTree = ""; 147 | }; 148 | 3F392654501636843708FEC78200BF54 /* Development Pods */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | DD84F62D0935C96BA28CE37708C9989C /* XHTagView */, 152 | ); 153 | name = "Development Pods"; 154 | sourceTree = ""; 155 | }; 156 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 18340F12838DEE43507667CC74401EB1 /* iOS */, 160 | ); 161 | name = Frameworks; 162 | sourceTree = ""; 163 | }; 164 | 53590D1FC9DBFEA3241155469E70BBE0 /* XHTagView */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | AE94B4920FB2EEB507A1549E944679D3 /* Classes */, 168 | ); 169 | path = XHTagView; 170 | sourceTree = ""; 171 | }; 172 | 6AA9670BB2FB4F09BE9870AFBA01CA43 /* Model */ = { 173 | isa = PBXGroup; 174 | children = ( 175 | 28990FE0386D846E135099E74332EB20 /* XHBranchPoint.h */, 176 | 9E70DD18498B23AE5E8F8B5FE3AB713B /* XHBranchPoint.m */, 177 | ); 178 | path = Model; 179 | sourceTree = ""; 180 | }; 181 | 77483729810E2640F39D2EA898111748 /* Views */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 8DF0BB251DFE8A6FBC015CC614E7DBE6 /* XHBranchTextView.h */, 185 | 54166236D1BF933A38EAB64302624195 /* XHBranchTextView.m */, 186 | 1E3EAD7AE8563F051DE953501CDD9D87 /* XHCenterView.h */, 187 | 985DAB0BFB63207D6125BC86FE40DF8F /* XHCenterView.m */, 188 | 1AFD901470651BE4A01B1F16E5A16FD6 /* XHTagView.h */, 189 | 32655558443C942D3737B6F39036E95E /* XHTagView.m */, 190 | ); 191 | path = Views; 192 | sourceTree = ""; 193 | }; 194 | 7DB346D0F39D3F0E887471402A8071AB = { 195 | isa = PBXGroup; 196 | children = ( 197 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, 198 | 3F392654501636843708FEC78200BF54 /* Development Pods */, 199 | 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, 200 | 338BB462567CE0EBD9FCBAB76E286F66 /* Products */, 201 | A72B527EDF0A71CED84AD44BA998042A /* Targets Support Files */, 202 | ); 203 | sourceTree = ""; 204 | }; 205 | 86BE353740EAA39B96E53F89A3A2E458 /* Pods-XHTagViewDemo */ = { 206 | isa = PBXGroup; 207 | children = ( 208 | 709C3E080A8BDEA8710F2C9DD63A50CC /* Pods-XHTagViewDemo-acknowledgements.markdown */, 209 | 65A555A8BD8FA5EA9632637215FA2195 /* Pods-XHTagViewDemo-acknowledgements.plist */, 210 | BE352EA278DFC0EBEE2EA324C8D1FDE7 /* Pods-XHTagViewDemo-dummy.m */, 211 | 1E444D5ABB748136278D83A995F6D686 /* Pods-XHTagViewDemo-frameworks.sh */, 212 | 2483AFD2DE40C600B21214FC2B8EB38E /* Pods-XHTagViewDemo-resources.sh */, 213 | 043E10622BF7B0578B79893E63627BC4 /* Pods-XHTagViewDemo.debug.xcconfig */, 214 | B2A7B3FBEE218ADC779A615F30080B70 /* Pods-XHTagViewDemo.release.xcconfig */, 215 | ); 216 | name = "Pods-XHTagViewDemo"; 217 | path = "Target Support Files/Pods-XHTagViewDemo"; 218 | sourceTree = ""; 219 | }; 220 | 90F95AC6E7B8B6B01C9D36F457FF67A2 /* XHTagView */ = { 221 | isa = PBXGroup; 222 | children = ( 223 | 3B0138F845A78A7E5F3C219DEB9A2F53 /* Resources */, 224 | ); 225 | path = XHTagView; 226 | sourceTree = ""; 227 | }; 228 | A72B527EDF0A71CED84AD44BA998042A /* Targets Support Files */ = { 229 | isa = PBXGroup; 230 | children = ( 231 | 86BE353740EAA39B96E53F89A3A2E458 /* Pods-XHTagViewDemo */, 232 | ); 233 | name = "Targets Support Files"; 234 | sourceTree = ""; 235 | }; 236 | AE94B4920FB2EEB507A1549E944679D3 /* Classes */ = { 237 | isa = PBXGroup; 238 | children = ( 239 | 28A3C7621E2AD496D3E24C4D2A13EB07 /* Header */, 240 | 3A00786E6DD0622B4CFFE1A49FA0BA1D /* Layers */, 241 | 6AA9670BB2FB4F09BE9870AFBA01CA43 /* Model */, 242 | 77483729810E2640F39D2EA898111748 /* Views */, 243 | ); 244 | path = Classes; 245 | sourceTree = ""; 246 | }; 247 | C268193E1786D9A284D38B44E3E8E499 /* Resources */ = { 248 | isa = PBXGroup; 249 | children = ( 250 | 90F95AC6E7B8B6B01C9D36F457FF67A2 /* XHTagView */, 251 | ); 252 | name = Resources; 253 | sourceTree = ""; 254 | }; 255 | C9A4A0CAFAC58F23255A932E9638DAC2 /* Support Files */ = { 256 | isa = PBXGroup; 257 | children = ( 258 | 8C0C34D9CC79908345059E05DBB950BB /* XHTagView.xcconfig */, 259 | DA1F25F26FAEF0FFA10FBAEA048E1DB7 /* XHTagView-dummy.m */, 260 | 7A23366509DEE4E8C75CA4CD8C41118B /* XHTagView-prefix.pch */, 261 | ); 262 | name = "Support Files"; 263 | path = "XHTagViewDemo/Pods/Target Support Files/XHTagView"; 264 | sourceTree = ""; 265 | }; 266 | DD84F62D0935C96BA28CE37708C9989C /* XHTagView */ = { 267 | isa = PBXGroup; 268 | children = ( 269 | C268193E1786D9A284D38B44E3E8E499 /* Resources */, 270 | C9A4A0CAFAC58F23255A932E9638DAC2 /* Support Files */, 271 | 53590D1FC9DBFEA3241155469E70BBE0 /* XHTagView */, 272 | ); 273 | name = XHTagView; 274 | path = ../..; 275 | sourceTree = ""; 276 | }; 277 | /* End PBXGroup section */ 278 | 279 | /* Begin PBXHeadersBuildPhase section */ 280 | 9B93C7D4FD468746E2728017F5AEF1C2 /* Headers */ = { 281 | isa = PBXHeadersBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | E3B10C227F1ACCA02B0CD666BDC61A97 /* XHBranchLayer.h in Headers */, 285 | 46653D30A92B881FF4C853DF89141886 /* XHBranchPoint.h in Headers */, 286 | F8966A257611B5B0C97FEC72BBFDA1B8 /* XHBranchTextView.h in Headers */, 287 | 16E83D270A72810DB45D6B0DED7DEA23 /* XHCenterView.h in Headers */, 288 | 71168E2FAB352CE1E6FBE2120FB01D53 /* XHFocusLayer.h in Headers */, 289 | B0D5E609A2D5C9E4F494C2130B20BE67 /* XHTagHeader.h in Headers */, 290 | B4DE555FB6113F9B51F10CFBBA01831D /* XHTagView.h in Headers */, 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | /* End PBXHeadersBuildPhase section */ 295 | 296 | /* Begin PBXNativeTarget section */ 297 | 0B8DE216554E927FAC9BB85196CDC28A /* XHTagView */ = { 298 | isa = PBXNativeTarget; 299 | buildConfigurationList = EC72DFB9A0944C2BC8890D58B30B6443 /* Build configuration list for PBXNativeTarget "XHTagView" */; 300 | buildPhases = ( 301 | CA5FC8D6A08E22DBB90A75D4DAF77CD3 /* Sources */, 302 | 5D4276F3358B6AAD8341C60D6DD69D64 /* Frameworks */, 303 | 9B93C7D4FD468746E2728017F5AEF1C2 /* Headers */, 304 | ); 305 | buildRules = ( 306 | ); 307 | dependencies = ( 308 | ); 309 | name = XHTagView; 310 | productName = XHTagView; 311 | productReference = 8B14BF15945E0215C43F36D35757A6BC /* libXHTagView.a */; 312 | productType = "com.apple.product-type.library.static"; 313 | }; 314 | 6ACAE19D63F5FBFAD5E100C13DCB55D0 /* Pods-XHTagViewDemo */ = { 315 | isa = PBXNativeTarget; 316 | buildConfigurationList = 18B9846E8CCA93E891CF885E24650458 /* Build configuration list for PBXNativeTarget "Pods-XHTagViewDemo" */; 317 | buildPhases = ( 318 | 94FF29F139DDAB44DAB933608489521A /* Sources */, 319 | 3647EE74FE3CA80823B9A521B7F3511A /* Frameworks */, 320 | ); 321 | buildRules = ( 322 | ); 323 | dependencies = ( 324 | 37690773A475EE8569CF396FC9732683 /* PBXTargetDependency */, 325 | ); 326 | name = "Pods-XHTagViewDemo"; 327 | productName = "Pods-XHTagViewDemo"; 328 | productReference = 3191542BE5C0C2C33CEE7F429CB23939 /* libPods-XHTagViewDemo.a */; 329 | productType = "com.apple.product-type.library.static"; 330 | }; 331 | /* End PBXNativeTarget section */ 332 | 333 | /* Begin PBXProject section */ 334 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 335 | isa = PBXProject; 336 | attributes = { 337 | LastSwiftUpdateCheck = 0700; 338 | LastUpgradeCheck = 0700; 339 | }; 340 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 341 | compatibilityVersion = "Xcode 3.2"; 342 | developmentRegion = English; 343 | hasScannedForEncodings = 0; 344 | knownRegions = ( 345 | en, 346 | ); 347 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 348 | productRefGroup = 338BB462567CE0EBD9FCBAB76E286F66 /* Products */; 349 | projectDirPath = ""; 350 | projectRoot = ""; 351 | targets = ( 352 | 6ACAE19D63F5FBFAD5E100C13DCB55D0 /* Pods-XHTagViewDemo */, 353 | 0B8DE216554E927FAC9BB85196CDC28A /* XHTagView */, 354 | ); 355 | }; 356 | /* End PBXProject section */ 357 | 358 | /* Begin PBXSourcesBuildPhase section */ 359 | 94FF29F139DDAB44DAB933608489521A /* Sources */ = { 360 | isa = PBXSourcesBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | 4C2B92036E3BF2F99DA8F1A207BE881F /* Pods-XHTagViewDemo-dummy.m in Sources */, 364 | ); 365 | runOnlyForDeploymentPostprocessing = 0; 366 | }; 367 | CA5FC8D6A08E22DBB90A75D4DAF77CD3 /* Sources */ = { 368 | isa = PBXSourcesBuildPhase; 369 | buildActionMask = 2147483647; 370 | files = ( 371 | F778DE189A93ACC0E6745EE356705621 /* XHBranchLayer.m in Sources */, 372 | A69C1ECB0CF712BD8269230A2053FEC4 /* XHBranchPoint.m in Sources */, 373 | C6E171F92D5B9352EC3A7B39C9E8D758 /* XHBranchTextView.m in Sources */, 374 | 39D981D67A66D2F58370527BD522E6DB /* XHCenterView.m in Sources */, 375 | 6094C234DA03FDE8516DEFCD9414F58F /* XHFocusLayer.m in Sources */, 376 | EDA780E0A12D568967642ABC8EBE73A4 /* XHTagView-dummy.m in Sources */, 377 | B7D8CE48AB96C2AADA21B787BDCF1064 /* XHTagView.m in Sources */, 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | }; 381 | /* End PBXSourcesBuildPhase section */ 382 | 383 | /* Begin PBXTargetDependency section */ 384 | 37690773A475EE8569CF396FC9732683 /* PBXTargetDependency */ = { 385 | isa = PBXTargetDependency; 386 | name = XHTagView; 387 | target = 0B8DE216554E927FAC9BB85196CDC28A /* XHTagView */; 388 | targetProxy = 859A486A2480ED444B423FAA8E4D3F1A /* PBXContainerItemProxy */; 389 | }; 390 | /* End PBXTargetDependency section */ 391 | 392 | /* Begin XCBuildConfiguration section */ 393 | 31F5C101387F451F8CF774B2BBF0F25F /* Release */ = { 394 | isa = XCBuildConfiguration; 395 | baseConfigurationReference = B2A7B3FBEE218ADC779A615F30080B70 /* Pods-XHTagViewDemo.release.xcconfig */; 396 | buildSettings = { 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 399 | MACH_O_TYPE = staticlib; 400 | MTL_ENABLE_DEBUG_INFO = NO; 401 | OTHER_LDFLAGS = ""; 402 | OTHER_LIBTOOLFLAGS = ""; 403 | PODS_ROOT = "$(SRCROOT)"; 404 | PRODUCT_NAME = "$(TARGET_NAME)"; 405 | SDKROOT = iphoneos; 406 | SKIP_INSTALL = YES; 407 | }; 408 | name = Release; 409 | }; 410 | 76B965B017C65AD6997F5AD55CCB93D1 /* Debug */ = { 411 | isa = XCBuildConfiguration; 412 | baseConfigurationReference = 8C0C34D9CC79908345059E05DBB950BB /* XHTagView.xcconfig */; 413 | buildSettings = { 414 | ENABLE_STRICT_OBJC_MSGSEND = YES; 415 | GCC_PREFIX_HEADER = "Target Support Files/XHTagView/XHTagView-prefix.pch"; 416 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 417 | MTL_ENABLE_DEBUG_INFO = YES; 418 | OTHER_LDFLAGS = ""; 419 | OTHER_LIBTOOLFLAGS = ""; 420 | PRIVATE_HEADERS_FOLDER_PATH = ""; 421 | PRODUCT_NAME = "$(TARGET_NAME)"; 422 | PUBLIC_HEADERS_FOLDER_PATH = ""; 423 | SDKROOT = iphoneos; 424 | SKIP_INSTALL = YES; 425 | }; 426 | name = Debug; 427 | }; 428 | 8D1534490D941DCA47C62AC4314182AF /* Debug */ = { 429 | isa = XCBuildConfiguration; 430 | buildSettings = { 431 | ALWAYS_SEARCH_USER_PATHS = NO; 432 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 433 | CLANG_CXX_LIBRARY = "libc++"; 434 | CLANG_ENABLE_MODULES = YES; 435 | CLANG_ENABLE_OBJC_ARC = YES; 436 | CLANG_WARN_BOOL_CONVERSION = YES; 437 | CLANG_WARN_CONSTANT_CONVERSION = YES; 438 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 439 | CLANG_WARN_EMPTY_BODY = YES; 440 | CLANG_WARN_ENUM_CONVERSION = YES; 441 | CLANG_WARN_INT_CONVERSION = YES; 442 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 443 | CLANG_WARN_UNREACHABLE_CODE = YES; 444 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 445 | COPY_PHASE_STRIP = NO; 446 | GCC_C_LANGUAGE_STANDARD = gnu99; 447 | GCC_DYNAMIC_NO_PIC = NO; 448 | GCC_OPTIMIZATION_LEVEL = 0; 449 | GCC_PREPROCESSOR_DEFINITIONS = ( 450 | "DEBUG=1", 451 | "$(inherited)", 452 | ); 453 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 454 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 455 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 456 | GCC_WARN_UNDECLARED_SELECTOR = YES; 457 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 458 | GCC_WARN_UNUSED_FUNCTION = YES; 459 | GCC_WARN_UNUSED_VARIABLE = YES; 460 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 461 | ONLY_ACTIVE_ARCH = YES; 462 | STRIP_INSTALLED_PRODUCT = NO; 463 | SYMROOT = "${SRCROOT}/../build"; 464 | }; 465 | name = Debug; 466 | }; 467 | 92B31CED1996AC13460E9996FB8863A1 /* Debug */ = { 468 | isa = XCBuildConfiguration; 469 | baseConfigurationReference = 043E10622BF7B0578B79893E63627BC4 /* Pods-XHTagViewDemo.debug.xcconfig */; 470 | buildSettings = { 471 | ENABLE_STRICT_OBJC_MSGSEND = YES; 472 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 473 | MACH_O_TYPE = staticlib; 474 | MTL_ENABLE_DEBUG_INFO = YES; 475 | OTHER_LDFLAGS = ""; 476 | OTHER_LIBTOOLFLAGS = ""; 477 | PODS_ROOT = "$(SRCROOT)"; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | SDKROOT = iphoneos; 480 | SKIP_INSTALL = YES; 481 | }; 482 | name = Debug; 483 | }; 484 | C5A18280E9321A9268D1C80B7DA43967 /* Release */ = { 485 | isa = XCBuildConfiguration; 486 | buildSettings = { 487 | ALWAYS_SEARCH_USER_PATHS = NO; 488 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 489 | CLANG_CXX_LIBRARY = "libc++"; 490 | CLANG_ENABLE_MODULES = YES; 491 | CLANG_ENABLE_OBJC_ARC = YES; 492 | CLANG_WARN_BOOL_CONVERSION = YES; 493 | CLANG_WARN_CONSTANT_CONVERSION = YES; 494 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 495 | CLANG_WARN_EMPTY_BODY = YES; 496 | CLANG_WARN_ENUM_CONVERSION = YES; 497 | CLANG_WARN_INT_CONVERSION = YES; 498 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 499 | CLANG_WARN_UNREACHABLE_CODE = YES; 500 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 501 | COPY_PHASE_STRIP = YES; 502 | ENABLE_NS_ASSERTIONS = NO; 503 | GCC_C_LANGUAGE_STANDARD = gnu99; 504 | GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; 505 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 506 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 507 | GCC_WARN_UNDECLARED_SELECTOR = YES; 508 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 509 | GCC_WARN_UNUSED_FUNCTION = YES; 510 | GCC_WARN_UNUSED_VARIABLE = YES; 511 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 512 | STRIP_INSTALLED_PRODUCT = NO; 513 | SYMROOT = "${SRCROOT}/../build"; 514 | VALIDATE_PRODUCT = YES; 515 | }; 516 | name = Release; 517 | }; 518 | E442EAD32001B2808BE94AAFE8E64AA6 /* Release */ = { 519 | isa = XCBuildConfiguration; 520 | baseConfigurationReference = 8C0C34D9CC79908345059E05DBB950BB /* XHTagView.xcconfig */; 521 | buildSettings = { 522 | ENABLE_STRICT_OBJC_MSGSEND = YES; 523 | GCC_PREFIX_HEADER = "Target Support Files/XHTagView/XHTagView-prefix.pch"; 524 | IPHONEOS_DEPLOYMENT_TARGET = 9.2; 525 | MTL_ENABLE_DEBUG_INFO = NO; 526 | OTHER_LDFLAGS = ""; 527 | OTHER_LIBTOOLFLAGS = ""; 528 | PRIVATE_HEADERS_FOLDER_PATH = ""; 529 | PRODUCT_NAME = "$(TARGET_NAME)"; 530 | PUBLIC_HEADERS_FOLDER_PATH = ""; 531 | SDKROOT = iphoneos; 532 | SKIP_INSTALL = YES; 533 | }; 534 | name = Release; 535 | }; 536 | /* End XCBuildConfiguration section */ 537 | 538 | /* Begin XCConfigurationList section */ 539 | 18B9846E8CCA93E891CF885E24650458 /* Build configuration list for PBXNativeTarget "Pods-XHTagViewDemo" */ = { 540 | isa = XCConfigurationList; 541 | buildConfigurations = ( 542 | 92B31CED1996AC13460E9996FB8863A1 /* Debug */, 543 | 31F5C101387F451F8CF774B2BBF0F25F /* Release */, 544 | ); 545 | defaultConfigurationIsVisible = 0; 546 | defaultConfigurationName = Release; 547 | }; 548 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 549 | isa = XCConfigurationList; 550 | buildConfigurations = ( 551 | 8D1534490D941DCA47C62AC4314182AF /* Debug */, 552 | C5A18280E9321A9268D1C80B7DA43967 /* Release */, 553 | ); 554 | defaultConfigurationIsVisible = 0; 555 | defaultConfigurationName = Release; 556 | }; 557 | EC72DFB9A0944C2BC8890D58B30B6443 /* Build configuration list for PBXNativeTarget "XHTagView" */ = { 558 | isa = XCConfigurationList; 559 | buildConfigurations = ( 560 | 76B965B017C65AD6997F5AD55CCB93D1 /* Debug */, 561 | E442EAD32001B2808BE94AAFE8E64AA6 /* Release */, 562 | ); 563 | defaultConfigurationIsVisible = 0; 564 | defaultConfigurationName = Release; 565 | }; 566 | /* End XCConfigurationList section */ 567 | }; 568 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 569 | } 570 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Pods.xcodeproj/xcshareddata/xcschemes/XHTagView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## XHTagView 5 | 6 | The MIT License (MIT) 7 | 8 | Copyright (c) 2016 曾宪华 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - http://cocoapods.org 29 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | The MIT License (MIT) 18 | 19 | Copyright (c) 2016 曾宪华 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | Title 40 | XHTagView 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - http://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_XHTagViewDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_XHTagViewDemo 5 | @end 6 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | if [[ "$CONFIGURATION" == "Debug" ]]; then 61 | install_resource "../../XHTagView/Resources/tag-background-left@2x.png" 62 | install_resource "../../XHTagView/Resources/tag-background-left@3x.png" 63 | install_resource "../../XHTagView/Resources/tag-background-right@2x.png" 64 | install_resource "../../XHTagView/Resources/tag-background-right@3x.png" 65 | install_resource "../../XHTagView/Resources/tag-center@2x.png" 66 | install_resource "../../XHTagView/Resources/tag-center@3x.png" 67 | fi 68 | if [[ "$CONFIGURATION" == "Release" ]]; then 69 | install_resource "../../XHTagView/Resources/tag-background-left@2x.png" 70 | install_resource "../../XHTagView/Resources/tag-background-left@3x.png" 71 | install_resource "../../XHTagView/Resources/tag-background-right@2x.png" 72 | install_resource "../../XHTagView/Resources/tag-background-right@3x.png" 73 | install_resource "../../XHTagView/Resources/tag-center@2x.png" 74 | install_resource "../../XHTagView/Resources/tag-center@3x.png" 75 | fi 76 | 77 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 78 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 79 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 80 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 82 | fi 83 | rm -f "$RESOURCES_TO_COPY" 84 | 85 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 86 | then 87 | case "${TARGETED_DEVICE_FAMILY}" in 88 | 1,2) 89 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 90 | ;; 91 | 1) 92 | TARGET_DEVICE_ARGS="--target-device iphone" 93 | ;; 94 | 2) 95 | TARGET_DEVICE_ARGS="--target-device ipad" 96 | ;; 97 | *) 98 | TARGET_DEVICE_ARGS="--target-device mac" 99 | ;; 100 | esac 101 | 102 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 103 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 104 | while read line; do 105 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 106 | XCASSET_FILES+=("$line") 107 | fi 108 | done <<<"$OTHER_XCASSETS" 109 | 110 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 111 | fi 112 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/XHTagView" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/XHTagView" 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"XHTagView" -framework "Foundation" -framework "UIKit" 5 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/XHTagView" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/XHTagView" 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"XHTagView" -framework "Foundation" -framework "UIKit" 5 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/XHTagView/XHTagView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_XHTagView : NSObject 3 | @end 4 | @implementation PodsDummy_XHTagView 5 | @end 6 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/XHTagView/XHTagView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /XHTagViewDemo/Pods/Target Support Files/XHTagView/XHTagView.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/XHTagView" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/XHTagView" 3 | OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" 4 | PODS_ROOT = ${SRCROOT} 5 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | E47F28501C7B1F2C00CBDE46 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E47F284F1C7B1F2C00CBDE46 /* main.m */; }; 11 | E47F28531C7B1F2C00CBDE46 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E47F28521C7B1F2C00CBDE46 /* AppDelegate.m */; }; 12 | E47F28561C7B1F2C00CBDE46 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E47F28551C7B1F2C00CBDE46 /* ViewController.m */; }; 13 | E47F28591C7B1F2C00CBDE46 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E47F28571C7B1F2C00CBDE46 /* Main.storyboard */; }; 14 | E47F285B1C7B1F2C00CBDE46 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E47F285A1C7B1F2C00CBDE46 /* Assets.xcassets */; }; 15 | E47F285E1C7B1F2C00CBDE46 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E47F285C1C7B1F2C00CBDE46 /* LaunchScreen.storyboard */; }; 16 | E47F28691C7B1F2C00CBDE46 /* XHTagViewDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E47F28681C7B1F2C00CBDE46 /* XHTagViewDemoTests.m */; }; 17 | E47F28741C7B1F2C00CBDE46 /* XHTagViewDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = E47F28731C7B1F2C00CBDE46 /* XHTagViewDemoUITests.m */; }; 18 | E755AA483E18E649DD7D240B /* libPods-XHTagViewDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BD80510F1F6D4CFA347093C3 /* libPods-XHTagViewDemo.a */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | E47F28651C7B1F2C00CBDE46 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = E47F28431C7B1F2B00CBDE46 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = E47F284A1C7B1F2C00CBDE46; 27 | remoteInfo = XHTagViewDemo; 28 | }; 29 | E47F28701C7B1F2C00CBDE46 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = E47F28431C7B1F2B00CBDE46 /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = E47F284A1C7B1F2C00CBDE46; 34 | remoteInfo = XHTagViewDemo; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXFileReference section */ 39 | 6194C8888B631B3C63D82E59 /* Pods-XHTagViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XHTagViewDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo.release.xcconfig"; sourceTree = ""; }; 40 | 88623D0CED13678614629647 /* Pods-XHTagViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-XHTagViewDemo.debug.xcconfig"; path = "Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo.debug.xcconfig"; sourceTree = ""; }; 41 | BD80510F1F6D4CFA347093C3 /* libPods-XHTagViewDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-XHTagViewDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | E47F284B1C7B1F2C00CBDE46 /* XHTagViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XHTagViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | E47F284F1C7B1F2C00CBDE46 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 44 | E47F28511C7B1F2C00CBDE46 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 45 | E47F28521C7B1F2C00CBDE46 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 46 | E47F28541C7B1F2C00CBDE46 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 47 | E47F28551C7B1F2C00CBDE46 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 48 | E47F28581C7B1F2C00CBDE46 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 49 | E47F285A1C7B1F2C00CBDE46 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 50 | E47F285D1C7B1F2C00CBDE46 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 51 | E47F285F1C7B1F2C00CBDE46 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | E47F28641C7B1F2C00CBDE46 /* XHTagViewDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XHTagViewDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | E47F28681C7B1F2C00CBDE46 /* XHTagViewDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XHTagViewDemoTests.m; sourceTree = ""; }; 54 | E47F286A1C7B1F2C00CBDE46 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | E47F286F1C7B1F2C00CBDE46 /* XHTagViewDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XHTagViewDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 56 | E47F28731C7B1F2C00CBDE46 /* XHTagViewDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XHTagViewDemoUITests.m; sourceTree = ""; }; 57 | E47F28751C7B1F2C00CBDE46 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | E47F28481C7B1F2C00CBDE46 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | E755AA483E18E649DD7D240B /* libPods-XHTagViewDemo.a in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | E47F28611C7B1F2C00CBDE46 /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | E47F286C1C7B1F2C00CBDE46 /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | /* End PBXFrameworksBuildPhase section */ 84 | 85 | /* Begin PBXGroup section */ 86 | 0202C3A482F87AE98616EE51 /* Pods */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 88623D0CED13678614629647 /* Pods-XHTagViewDemo.debug.xcconfig */, 90 | 6194C8888B631B3C63D82E59 /* Pods-XHTagViewDemo.release.xcconfig */, 91 | ); 92 | name = Pods; 93 | sourceTree = ""; 94 | }; 95 | 472D10E8BE78E90C606D0D50 /* Frameworks */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | BD80510F1F6D4CFA347093C3 /* libPods-XHTagViewDemo.a */, 99 | ); 100 | name = Frameworks; 101 | sourceTree = ""; 102 | }; 103 | E47F28421C7B1F2B00CBDE46 = { 104 | isa = PBXGroup; 105 | children = ( 106 | E47F284D1C7B1F2C00CBDE46 /* XHTagViewDemo */, 107 | E47F28671C7B1F2C00CBDE46 /* XHTagViewDemoTests */, 108 | E47F28721C7B1F2C00CBDE46 /* XHTagViewDemoUITests */, 109 | E47F284C1C7B1F2C00CBDE46 /* Products */, 110 | 0202C3A482F87AE98616EE51 /* Pods */, 111 | 472D10E8BE78E90C606D0D50 /* Frameworks */, 112 | ); 113 | sourceTree = ""; 114 | }; 115 | E47F284C1C7B1F2C00CBDE46 /* Products */ = { 116 | isa = PBXGroup; 117 | children = ( 118 | E47F284B1C7B1F2C00CBDE46 /* XHTagViewDemo.app */, 119 | E47F28641C7B1F2C00CBDE46 /* XHTagViewDemoTests.xctest */, 120 | E47F286F1C7B1F2C00CBDE46 /* XHTagViewDemoUITests.xctest */, 121 | ); 122 | name = Products; 123 | sourceTree = ""; 124 | }; 125 | E47F284D1C7B1F2C00CBDE46 /* XHTagViewDemo */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | E47F28511C7B1F2C00CBDE46 /* AppDelegate.h */, 129 | E47F28521C7B1F2C00CBDE46 /* AppDelegate.m */, 130 | E47F28541C7B1F2C00CBDE46 /* ViewController.h */, 131 | E47F28551C7B1F2C00CBDE46 /* ViewController.m */, 132 | E47F28571C7B1F2C00CBDE46 /* Main.storyboard */, 133 | E47F285A1C7B1F2C00CBDE46 /* Assets.xcassets */, 134 | E47F285C1C7B1F2C00CBDE46 /* LaunchScreen.storyboard */, 135 | E47F285F1C7B1F2C00CBDE46 /* Info.plist */, 136 | E47F284E1C7B1F2C00CBDE46 /* Supporting Files */, 137 | ); 138 | path = XHTagViewDemo; 139 | sourceTree = ""; 140 | }; 141 | E47F284E1C7B1F2C00CBDE46 /* Supporting Files */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | E47F284F1C7B1F2C00CBDE46 /* main.m */, 145 | ); 146 | name = "Supporting Files"; 147 | sourceTree = ""; 148 | }; 149 | E47F28671C7B1F2C00CBDE46 /* XHTagViewDemoTests */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | E47F28681C7B1F2C00CBDE46 /* XHTagViewDemoTests.m */, 153 | E47F286A1C7B1F2C00CBDE46 /* Info.plist */, 154 | ); 155 | path = XHTagViewDemoTests; 156 | sourceTree = ""; 157 | }; 158 | E47F28721C7B1F2C00CBDE46 /* XHTagViewDemoUITests */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | E47F28731C7B1F2C00CBDE46 /* XHTagViewDemoUITests.m */, 162 | E47F28751C7B1F2C00CBDE46 /* Info.plist */, 163 | ); 164 | path = XHTagViewDemoUITests; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXNativeTarget section */ 170 | E47F284A1C7B1F2C00CBDE46 /* XHTagViewDemo */ = { 171 | isa = PBXNativeTarget; 172 | buildConfigurationList = E47F28781C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemo" */; 173 | buildPhases = ( 174 | BF7A9144A705152616B714DD /* Check Pods Manifest.lock */, 175 | E47F28471C7B1F2C00CBDE46 /* Sources */, 176 | E47F28481C7B1F2C00CBDE46 /* Frameworks */, 177 | E47F28491C7B1F2C00CBDE46 /* Resources */, 178 | 485321DA73EE189B729D24C4 /* Embed Pods Frameworks */, 179 | 4972E33FF17AF54FB8097F17 /* Copy Pods Resources */, 180 | ); 181 | buildRules = ( 182 | ); 183 | dependencies = ( 184 | ); 185 | name = XHTagViewDemo; 186 | productName = XHTagViewDemo; 187 | productReference = E47F284B1C7B1F2C00CBDE46 /* XHTagViewDemo.app */; 188 | productType = "com.apple.product-type.application"; 189 | }; 190 | E47F28631C7B1F2C00CBDE46 /* XHTagViewDemoTests */ = { 191 | isa = PBXNativeTarget; 192 | buildConfigurationList = E47F287B1C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemoTests" */; 193 | buildPhases = ( 194 | E47F28601C7B1F2C00CBDE46 /* Sources */, 195 | E47F28611C7B1F2C00CBDE46 /* Frameworks */, 196 | E47F28621C7B1F2C00CBDE46 /* Resources */, 197 | ); 198 | buildRules = ( 199 | ); 200 | dependencies = ( 201 | E47F28661C7B1F2C00CBDE46 /* PBXTargetDependency */, 202 | ); 203 | name = XHTagViewDemoTests; 204 | productName = XHTagViewDemoTests; 205 | productReference = E47F28641C7B1F2C00CBDE46 /* XHTagViewDemoTests.xctest */; 206 | productType = "com.apple.product-type.bundle.unit-test"; 207 | }; 208 | E47F286E1C7B1F2C00CBDE46 /* XHTagViewDemoUITests */ = { 209 | isa = PBXNativeTarget; 210 | buildConfigurationList = E47F287E1C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemoUITests" */; 211 | buildPhases = ( 212 | E47F286B1C7B1F2C00CBDE46 /* Sources */, 213 | E47F286C1C7B1F2C00CBDE46 /* Frameworks */, 214 | E47F286D1C7B1F2C00CBDE46 /* Resources */, 215 | ); 216 | buildRules = ( 217 | ); 218 | dependencies = ( 219 | E47F28711C7B1F2C00CBDE46 /* PBXTargetDependency */, 220 | ); 221 | name = XHTagViewDemoUITests; 222 | productName = XHTagViewDemoUITests; 223 | productReference = E47F286F1C7B1F2C00CBDE46 /* XHTagViewDemoUITests.xctest */; 224 | productType = "com.apple.product-type.bundle.ui-testing"; 225 | }; 226 | /* End PBXNativeTarget section */ 227 | 228 | /* Begin PBXProject section */ 229 | E47F28431C7B1F2B00CBDE46 /* Project object */ = { 230 | isa = PBXProject; 231 | attributes = { 232 | LastUpgradeCheck = 0720; 233 | ORGANIZATIONNAME = "嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com"; 234 | TargetAttributes = { 235 | E47F284A1C7B1F2C00CBDE46 = { 236 | CreatedOnToolsVersion = 7.2.1; 237 | }; 238 | E47F28631C7B1F2C00CBDE46 = { 239 | CreatedOnToolsVersion = 7.2.1; 240 | TestTargetID = E47F284A1C7B1F2C00CBDE46; 241 | }; 242 | E47F286E1C7B1F2C00CBDE46 = { 243 | CreatedOnToolsVersion = 7.2.1; 244 | TestTargetID = E47F284A1C7B1F2C00CBDE46; 245 | }; 246 | }; 247 | }; 248 | buildConfigurationList = E47F28461C7B1F2B00CBDE46 /* Build configuration list for PBXProject "XHTagViewDemo" */; 249 | compatibilityVersion = "Xcode 3.2"; 250 | developmentRegion = English; 251 | hasScannedForEncodings = 0; 252 | knownRegions = ( 253 | en, 254 | Base, 255 | ); 256 | mainGroup = E47F28421C7B1F2B00CBDE46; 257 | productRefGroup = E47F284C1C7B1F2C00CBDE46 /* Products */; 258 | projectDirPath = ""; 259 | projectRoot = ""; 260 | targets = ( 261 | E47F284A1C7B1F2C00CBDE46 /* XHTagViewDemo */, 262 | E47F28631C7B1F2C00CBDE46 /* XHTagViewDemoTests */, 263 | E47F286E1C7B1F2C00CBDE46 /* XHTagViewDemoUITests */, 264 | ); 265 | }; 266 | /* End PBXProject section */ 267 | 268 | /* Begin PBXResourcesBuildPhase section */ 269 | E47F28491C7B1F2C00CBDE46 /* Resources */ = { 270 | isa = PBXResourcesBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | E47F285E1C7B1F2C00CBDE46 /* LaunchScreen.storyboard in Resources */, 274 | E47F285B1C7B1F2C00CBDE46 /* Assets.xcassets in Resources */, 275 | E47F28591C7B1F2C00CBDE46 /* Main.storyboard in Resources */, 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | E47F28621C7B1F2C00CBDE46 /* Resources */ = { 280 | isa = PBXResourcesBuildPhase; 281 | buildActionMask = 2147483647; 282 | files = ( 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | E47F286D1C7B1F2C00CBDE46 /* Resources */ = { 287 | isa = PBXResourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXResourcesBuildPhase section */ 294 | 295 | /* Begin PBXShellScriptBuildPhase section */ 296 | 485321DA73EE189B729D24C4 /* Embed Pods Frameworks */ = { 297 | isa = PBXShellScriptBuildPhase; 298 | buildActionMask = 2147483647; 299 | files = ( 300 | ); 301 | inputPaths = ( 302 | ); 303 | name = "Embed Pods Frameworks"; 304 | outputPaths = ( 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | shellPath = /bin/sh; 308 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-frameworks.sh\"\n"; 309 | showEnvVarsInLog = 0; 310 | }; 311 | 4972E33FF17AF54FB8097F17 /* Copy Pods Resources */ = { 312 | isa = PBXShellScriptBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | inputPaths = ( 317 | ); 318 | name = "Copy Pods Resources"; 319 | outputPaths = ( 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | shellPath = /bin/sh; 323 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-XHTagViewDemo/Pods-XHTagViewDemo-resources.sh\"\n"; 324 | showEnvVarsInLog = 0; 325 | }; 326 | BF7A9144A705152616B714DD /* Check Pods Manifest.lock */ = { 327 | isa = PBXShellScriptBuildPhase; 328 | buildActionMask = 2147483647; 329 | files = ( 330 | ); 331 | inputPaths = ( 332 | ); 333 | name = "Check Pods Manifest.lock"; 334 | outputPaths = ( 335 | ); 336 | runOnlyForDeploymentPostprocessing = 0; 337 | shellPath = /bin/sh; 338 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 339 | showEnvVarsInLog = 0; 340 | }; 341 | /* End PBXShellScriptBuildPhase section */ 342 | 343 | /* Begin PBXSourcesBuildPhase section */ 344 | E47F28471C7B1F2C00CBDE46 /* Sources */ = { 345 | isa = PBXSourcesBuildPhase; 346 | buildActionMask = 2147483647; 347 | files = ( 348 | E47F28561C7B1F2C00CBDE46 /* ViewController.m in Sources */, 349 | E47F28531C7B1F2C00CBDE46 /* AppDelegate.m in Sources */, 350 | E47F28501C7B1F2C00CBDE46 /* main.m in Sources */, 351 | ); 352 | runOnlyForDeploymentPostprocessing = 0; 353 | }; 354 | E47F28601C7B1F2C00CBDE46 /* Sources */ = { 355 | isa = PBXSourcesBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | E47F28691C7B1F2C00CBDE46 /* XHTagViewDemoTests.m in Sources */, 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | E47F286B1C7B1F2C00CBDE46 /* Sources */ = { 363 | isa = PBXSourcesBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | E47F28741C7B1F2C00CBDE46 /* XHTagViewDemoUITests.m in Sources */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | /* End PBXSourcesBuildPhase section */ 371 | 372 | /* Begin PBXTargetDependency section */ 373 | E47F28661C7B1F2C00CBDE46 /* PBXTargetDependency */ = { 374 | isa = PBXTargetDependency; 375 | target = E47F284A1C7B1F2C00CBDE46 /* XHTagViewDemo */; 376 | targetProxy = E47F28651C7B1F2C00CBDE46 /* PBXContainerItemProxy */; 377 | }; 378 | E47F28711C7B1F2C00CBDE46 /* PBXTargetDependency */ = { 379 | isa = PBXTargetDependency; 380 | target = E47F284A1C7B1F2C00CBDE46 /* XHTagViewDemo */; 381 | targetProxy = E47F28701C7B1F2C00CBDE46 /* PBXContainerItemProxy */; 382 | }; 383 | /* End PBXTargetDependency section */ 384 | 385 | /* Begin PBXVariantGroup section */ 386 | E47F28571C7B1F2C00CBDE46 /* Main.storyboard */ = { 387 | isa = PBXVariantGroup; 388 | children = ( 389 | E47F28581C7B1F2C00CBDE46 /* Base */, 390 | ); 391 | name = Main.storyboard; 392 | sourceTree = ""; 393 | }; 394 | E47F285C1C7B1F2C00CBDE46 /* LaunchScreen.storyboard */ = { 395 | isa = PBXVariantGroup; 396 | children = ( 397 | E47F285D1C7B1F2C00CBDE46 /* Base */, 398 | ); 399 | name = LaunchScreen.storyboard; 400 | sourceTree = ""; 401 | }; 402 | /* End PBXVariantGroup section */ 403 | 404 | /* Begin XCBuildConfiguration section */ 405 | E47F28761C7B1F2C00CBDE46 /* Debug */ = { 406 | isa = XCBuildConfiguration; 407 | buildSettings = { 408 | ALWAYS_SEARCH_USER_PATHS = NO; 409 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 410 | CLANG_CXX_LIBRARY = "libc++"; 411 | CLANG_ENABLE_MODULES = YES; 412 | CLANG_ENABLE_OBJC_ARC = YES; 413 | CLANG_WARN_BOOL_CONVERSION = YES; 414 | CLANG_WARN_CONSTANT_CONVERSION = YES; 415 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 416 | CLANG_WARN_EMPTY_BODY = YES; 417 | CLANG_WARN_ENUM_CONVERSION = YES; 418 | CLANG_WARN_INT_CONVERSION = YES; 419 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 420 | CLANG_WARN_UNREACHABLE_CODE = YES; 421 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 422 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 423 | COPY_PHASE_STRIP = NO; 424 | DEBUG_INFORMATION_FORMAT = dwarf; 425 | ENABLE_STRICT_OBJC_MSGSEND = YES; 426 | ENABLE_TESTABILITY = YES; 427 | GCC_C_LANGUAGE_STANDARD = gnu99; 428 | GCC_DYNAMIC_NO_PIC = NO; 429 | GCC_NO_COMMON_BLOCKS = YES; 430 | GCC_OPTIMIZATION_LEVEL = 0; 431 | GCC_PREPROCESSOR_DEFINITIONS = ( 432 | "DEBUG=1", 433 | "$(inherited)", 434 | ); 435 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 436 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 437 | GCC_WARN_UNDECLARED_SELECTOR = YES; 438 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 439 | GCC_WARN_UNUSED_FUNCTION = YES; 440 | GCC_WARN_UNUSED_VARIABLE = YES; 441 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 442 | MTL_ENABLE_DEBUG_INFO = YES; 443 | ONLY_ACTIVE_ARCH = YES; 444 | SDKROOT = iphoneos; 445 | TARGETED_DEVICE_FAMILY = "1,2"; 446 | }; 447 | name = Debug; 448 | }; 449 | E47F28771C7B1F2C00CBDE46 /* Release */ = { 450 | isa = XCBuildConfiguration; 451 | buildSettings = { 452 | ALWAYS_SEARCH_USER_PATHS = NO; 453 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 454 | CLANG_CXX_LIBRARY = "libc++"; 455 | CLANG_ENABLE_MODULES = YES; 456 | CLANG_ENABLE_OBJC_ARC = YES; 457 | CLANG_WARN_BOOL_CONVERSION = YES; 458 | CLANG_WARN_CONSTANT_CONVERSION = YES; 459 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 460 | CLANG_WARN_EMPTY_BODY = YES; 461 | CLANG_WARN_ENUM_CONVERSION = YES; 462 | CLANG_WARN_INT_CONVERSION = YES; 463 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 464 | CLANG_WARN_UNREACHABLE_CODE = YES; 465 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 466 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 467 | COPY_PHASE_STRIP = NO; 468 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 469 | ENABLE_NS_ASSERTIONS = NO; 470 | ENABLE_STRICT_OBJC_MSGSEND = YES; 471 | GCC_C_LANGUAGE_STANDARD = gnu99; 472 | GCC_NO_COMMON_BLOCKS = YES; 473 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 474 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 475 | GCC_WARN_UNDECLARED_SELECTOR = YES; 476 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 477 | GCC_WARN_UNUSED_FUNCTION = YES; 478 | GCC_WARN_UNUSED_VARIABLE = YES; 479 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 480 | MTL_ENABLE_DEBUG_INFO = NO; 481 | SDKROOT = iphoneos; 482 | TARGETED_DEVICE_FAMILY = "1,2"; 483 | VALIDATE_PRODUCT = YES; 484 | }; 485 | name = Release; 486 | }; 487 | E47F28791C7B1F2C00CBDE46 /* Debug */ = { 488 | isa = XCBuildConfiguration; 489 | baseConfigurationReference = 88623D0CED13678614629647 /* Pods-XHTagViewDemo.debug.xcconfig */; 490 | buildSettings = { 491 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 492 | INFOPLIST_FILE = XHTagViewDemo/Info.plist; 493 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 494 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 495 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemo; 496 | PRODUCT_NAME = "$(TARGET_NAME)"; 497 | }; 498 | name = Debug; 499 | }; 500 | E47F287A1C7B1F2C00CBDE46 /* Release */ = { 501 | isa = XCBuildConfiguration; 502 | baseConfigurationReference = 6194C8888B631B3C63D82E59 /* Pods-XHTagViewDemo.release.xcconfig */; 503 | buildSettings = { 504 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 505 | INFOPLIST_FILE = XHTagViewDemo/Info.plist; 506 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 507 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 508 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemo; 509 | PRODUCT_NAME = "$(TARGET_NAME)"; 510 | }; 511 | name = Release; 512 | }; 513 | E47F287C1C7B1F2C00CBDE46 /* Debug */ = { 514 | isa = XCBuildConfiguration; 515 | buildSettings = { 516 | BUNDLE_LOADER = "$(TEST_HOST)"; 517 | INFOPLIST_FILE = XHTagViewDemoTests/Info.plist; 518 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 519 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemoTests; 520 | PRODUCT_NAME = "$(TARGET_NAME)"; 521 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XHTagViewDemo.app/XHTagViewDemo"; 522 | }; 523 | name = Debug; 524 | }; 525 | E47F287D1C7B1F2C00CBDE46 /* Release */ = { 526 | isa = XCBuildConfiguration; 527 | buildSettings = { 528 | BUNDLE_LOADER = "$(TEST_HOST)"; 529 | INFOPLIST_FILE = XHTagViewDemoTests/Info.plist; 530 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 531 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemoTests; 532 | PRODUCT_NAME = "$(TARGET_NAME)"; 533 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XHTagViewDemo.app/XHTagViewDemo"; 534 | }; 535 | name = Release; 536 | }; 537 | E47F287F1C7B1F2C00CBDE46 /* Debug */ = { 538 | isa = XCBuildConfiguration; 539 | buildSettings = { 540 | INFOPLIST_FILE = XHTagViewDemoUITests/Info.plist; 541 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 542 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemoUITests; 543 | PRODUCT_NAME = "$(TARGET_NAME)"; 544 | TEST_TARGET_NAME = XHTagViewDemo; 545 | USES_XCTRUNNER = YES; 546 | }; 547 | name = Debug; 548 | }; 549 | E47F28801C7B1F2C00CBDE46 /* Release */ = { 550 | isa = XCBuildConfiguration; 551 | buildSettings = { 552 | INFOPLIST_FILE = XHTagViewDemoUITests/Info.plist; 553 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 554 | PRODUCT_BUNDLE_IDENTIFIER = com.HUAJIE.XHTagViewDemoUITests; 555 | PRODUCT_NAME = "$(TARGET_NAME)"; 556 | TEST_TARGET_NAME = XHTagViewDemo; 557 | USES_XCTRUNNER = YES; 558 | }; 559 | name = Release; 560 | }; 561 | /* End XCBuildConfiguration section */ 562 | 563 | /* Begin XCConfigurationList section */ 564 | E47F28461C7B1F2B00CBDE46 /* Build configuration list for PBXProject "XHTagViewDemo" */ = { 565 | isa = XCConfigurationList; 566 | buildConfigurations = ( 567 | E47F28761C7B1F2C00CBDE46 /* Debug */, 568 | E47F28771C7B1F2C00CBDE46 /* Release */, 569 | ); 570 | defaultConfigurationIsVisible = 0; 571 | defaultConfigurationName = Release; 572 | }; 573 | E47F28781C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemo" */ = { 574 | isa = XCConfigurationList; 575 | buildConfigurations = ( 576 | E47F28791C7B1F2C00CBDE46 /* Debug */, 577 | E47F287A1C7B1F2C00CBDE46 /* Release */, 578 | ); 579 | defaultConfigurationIsVisible = 0; 580 | defaultConfigurationName = Release; 581 | }; 582 | E47F287B1C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemoTests" */ = { 583 | isa = XCConfigurationList; 584 | buildConfigurations = ( 585 | E47F287C1C7B1F2C00CBDE46 /* Debug */, 586 | E47F287D1C7B1F2C00CBDE46 /* Release */, 587 | ); 588 | defaultConfigurationIsVisible = 0; 589 | defaultConfigurationName = Release; 590 | }; 591 | E47F287E1C7B1F2C00CBDE46 /* Build configuration list for PBXNativeTarget "XHTagViewDemoUITests" */ = { 592 | isa = XCConfigurationList; 593 | buildConfigurations = ( 594 | E47F287F1C7B1F2C00CBDE46 /* Debug */, 595 | E47F28801C7B1F2C00CBDE46 /* Release */, 596 | ); 597 | defaultConfigurationIsVisible = 0; 598 | defaultConfigurationName = Release; 599 | }; 600 | /* End XCConfigurationList section */ 601 | }; 602 | rootObject = E47F28431C7B1F2B00CBDE46 /* Project object */; 603 | } 604 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // XHTagViewDemo 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // XHTagViewDemo 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // 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. 25 | // 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. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // 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. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 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 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-Small@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "29x29", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-Small@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "40x40", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-Spotlight-40@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "40x40", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-Spotlight-40@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "60x60", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-60@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-60@3x.png", 37 | "scale" : "3x" 38 | } 39 | ], 40 | "info" : { 41 | "version" : 1, 42 | "author" : "xcode" 43 | } 44 | } -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@2x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/AppIcon.appiconset/Icon-Spotlight-40@3x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/Eat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Eat@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Assets.xcassets/Eat.imageset/Eat@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xhzengAIB/TagView/59ff1a078055e04cf05d2cc04e06790d38f1bb37/XHTagViewDemo/XHTagViewDemo/Assets.xcassets/Eat.imageset/Eat@2x.png -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Tag 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UIStatusBarStyle 36 | UIStatusBarStyleLightContent 37 | UISupportedInterfaceOrientations 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationLandscapeLeft 41 | UIInterfaceOrientationLandscapeRight 42 | 43 | UISupportedInterfaceOrientations~ipad 44 | 45 | UIInterfaceOrientationPortrait 46 | UIInterfaceOrientationPortraitUpsideDown 47 | UIInterfaceOrientationLandscapeLeft 48 | UIInterfaceOrientationLandscapeRight 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // XHTagViewDemo 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // XHTagViewDemo 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import 11 | 12 | @interface ViewController () 13 | 14 | @property (nonatomic, weak) IBOutlet XHTagView *tagView; 15 | 16 | @end 17 | 18 | @implementation ViewController 19 | 20 | - (UIStatusBarStyle)preferredStatusBarStyle { 21 | return UIStatusBarStyleLightContent; 22 | } 23 | 24 | - (void)viewDidLoad { 25 | [super viewDidLoad]; 26 | 27 | self.tagView.branchTexts = @[@"我在吃广州美食", 28 | @"天猫可以买", 29 | @"Link: https://www...."]; 30 | 31 | UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGestureRecognizer:)]; 32 | [self.view addGestureRecognizer:tapGestureRecognizer]; 33 | NSLog(@"%@", self.tagView.branchTexts); 34 | } 35 | 36 | - (void)handleTapGestureRecognizer:(UITapGestureRecognizer *)tapGestureRecognizer { 37 | CGPoint point = [tapGestureRecognizer locationInView:tapGestureRecognizer.view]; 38 | 39 | [self.tagView showInPoint:point]; 40 | } 41 | 42 | - (void)showTagView { 43 | [self.tagView showInPoint:CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))]; 44 | } 45 | 46 | - (void)dismissTagView { 47 | [self.tagView dismiss]; 48 | self.tagView = nil; 49 | } 50 | 51 | - (void)didReceiveMemoryWarning { 52 | [super didReceiveMemoryWarning]; 53 | // Dispose of any resources that can be recreated. 54 | } 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // XHTagViewDemo 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemoTests/XHTagViewDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHTagViewDemoTests.m 3 | // XHTagViewDemoTests 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XHTagViewDemoTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation XHTagViewDemoTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemoUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /XHTagViewDemo/XHTagViewDemoUITests/XHTagViewDemoUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // XHTagViewDemoUITests.m 3 | // XHTagViewDemoUITests 4 | // 5 | // Created by Jack_iMac on 16/2/22. 6 | // Copyright © 2016年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface XHTagViewDemoUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation XHTagViewDemoUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | --------------------------------------------------------------------------------