├── .gitignore ├── .travis.yml ├── AGPullView.podspec ├── AGPullView ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── AGConfiguratorDelegate.h │ ├── AGListViewAnimationButton.h │ ├── AGListViewAnimationButton.m │ ├── AGPullMarginView.h │ ├── AGPullMarginView.m │ ├── AGPullView.h │ ├── AGPullView.m │ ├── AGPullViewConfigurator.h │ ├── AGPullViewConfigurator.m │ └── AGSettingsEnums.h ├── Example ├── AGPullView Swift │ ├── AGPullView_Example-Bridging-Header.h │ ├── AGViewControllerSwift.swift │ └── SwiftExample.storyboard ├── AGPullView.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── AGPullView-Example.xcscheme ├── AGPullView.xcworkspace │ └── contents.xcworkspacedata ├── AGPullView │ ├── AGAppDelegate.h │ ├── AGAppDelegate.m │ ├── AGPullView-Info.plist │ ├── AGPullView-Prefix.pch │ ├── AGViewController.h │ ├── AGViewController.m │ ├── AGViewController.xib │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── en.lproj │ │ └── InfoPlist.strings │ └── main.m ├── Podfile ├── Podfile.lock ├── Pods │ ├── Manifest.lock │ └── Pods.xcodeproj │ │ └── project.pbxproj └── Tests │ ├── Tests-Info.plist │ ├── Tests-Prefix.pch │ ├── Tests.m │ └── en.lproj │ └── InfoPlist.strings ├── LICENSE ├── README.md └── _Pods.xcodeproj /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Pods/ 26 | 27 | Carthage 28 | # We recommend against adding the Pods directory to your .gitignore. However 29 | # you should judge for yourself, the pros and cons are mentioned at: 30 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 31 | # 32 | # Note: if you ignore the Pods directory, make sure to uncomment 33 | # `pod install` in .travis.yml 34 | # 35 | # Pods/ 36 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -workspace Example/AGPullView.xcworkspace -scheme AGPullView-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /AGPullView.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint AGPullView.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'AGPullView' 11 | s.version = '0.5.0' 12 | s.summary = 'Container view for pulling it from bottom of its superview.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | This view could be container for any of yur content. I look forward to you suggestions and ideas for full customization. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/iaagg/AGPullView' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'Aleksey Getman' => 'getmanag@gmail.com' } 28 | s.source = { :git => 'https://github.com/iaagg/AGPullView.git', :tag => s.version.to_s } 29 | # s.social_media_url = 'https://twitter.com/' 30 | 31 | s.ios.deployment_target = '8.0' 32 | 33 | s.source_files = 'AGPullView/Classes/**/*' 34 | 35 | # s.resource_bundles = { 36 | # 'AGPullView' => ['AGPullView/Assets/*.png'] 37 | # } 38 | 39 | # s.public_header_files = 'Pod/Classes/**/*.h' 40 | # s.frameworks = 'UIKit', 'MapKit' 41 | # s.dependency 'AFNetworking', '~> 2.3' 42 | end 43 | -------------------------------------------------------------------------------- /AGPullView/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iaagg/AGPullView/61e922b5b7d8dce0abff10d3d7d7a1ea0ffbd76f/AGPullView/Assets/.gitkeep -------------------------------------------------------------------------------- /AGPullView/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iaagg/AGPullView/61e922b5b7d8dce0abff10d3d7d7a1ea0ffbd76f/AGPullView/Classes/.gitkeep -------------------------------------------------------------------------------- /AGPullView/Classes/AGConfiguratorDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Alexey Getman on 12/06/16. 3 | // Copyright © 2016 Alexey Getman. All rights reserved. 4 | // 5 | 6 | #ifndef AGConfiguratorDelegate_h 7 | #define AGConfiguratorDelegate_h 8 | @class AGPullView; 9 | 10 | @protocol AGConfiguratorDelegate 11 | 12 | @optional 13 | 14 | /*! 15 | * @discussion didShowPullView 16 | * @brief Called when AGPullView becomes shown 17 | * @param pullView - AGPullView 18 | */ 19 | - (void)didShowPullView:(AGPullView *)pullView; 20 | 21 | /*! 22 | * @discussion didHidePullView 23 | * @brief Called when AGPullView becomes hidden 24 | * @param pullView - AGPullView 25 | */ 26 | - (void)didHidePullView:(AGPullView *)pullView; 27 | 28 | /*! 29 | * @discussion didDrag 30 | * @brief Called when user is draging AGPulView in any direction (up/down) 31 | * @param pullView - AGPullView 32 | * @param openingPercent - value from 0 to 1 shows percent of opening AGPullView to it's max size 33 | */ 34 | - (void)didDragPullView:(AGPullView *)pullView withOpeningPercent:(float)openingPercent; 35 | 36 | /*! 37 | * @discussion didTouchToShowPullView 38 | * @brief Called when user touched on AGPulView when it hidden to show it 39 | * @param pullView - AGPullView 40 | */ 41 | - (void)didTouchToShowPullView:(AGPullView *)pullView; 42 | 43 | /*! 44 | * @discussion didTouchToHidePullView 45 | * @brief Called when user touched on AGPulView when it shown to hide it 46 | * @param pullView - AGPullView 47 | */ 48 | - (void)didTouchToHidePullView:(AGPullView *)pullView; 49 | @end 50 | 51 | #endif /* AGConfiguratorDelegate_h */ 52 | 53 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGListViewAnimationButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AGListViewAnimationButton : UIButton 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGListViewAnimationButton.m: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGListViewAnimationButton.h" 10 | 11 | @implementation AGListViewAnimationButton { 12 | BOOL isMotionTouchDetected; 13 | } 14 | 15 | //Throw touches to ListViewManagers's controller ([self.superview nextResponder]) 16 | 17 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 18 | 19 | isMotionTouchDetected = false; 20 | [super touchesBegan:touches withEvent:event]; 21 | [[self.superview nextResponder] touchesBegan:touches withEvent:event]; 22 | } 23 | 24 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 25 | 26 | if (isMotionTouchDetected) { 27 | [[self.superview nextResponder] touchesEnded:touches withEvent:event]; 28 | } else { 29 | [super touchesEnded:touches withEvent:event]; 30 | } 31 | } 32 | 33 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 34 | isMotionTouchDetected = true; 35 | [[self.superview nextResponder] touchesMoved:touches withEvent:event]; 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullMarginView.h: -------------------------------------------------------------------------------- 1 | // 2 | // AGPullMarginView.h 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AGPullMarginView : UIView 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullMarginView.m: -------------------------------------------------------------------------------- 1 | // 2 | // AGPullMarginView.m 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGPullMarginView.h" 10 | 11 | @implementation AGPullMarginView 12 | 13 | - (instancetype)initWithFrame:(CGRect)frame { 14 | if (self = [super initWithFrame:frame]) { 15 | self.backgroundColor = [UIColor orangeColor]; 16 | self.opaque = NO; 17 | } 18 | 19 | return self; 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullView.h: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import 10 | @class AGPullMarginView; 11 | 12 | @interface AGPullView : UIView 13 | 14 | @property (strong, nonatomic, readonly) UIView *contentView; 15 | @property (strong, nonatomic, readonly) AGPullMarginView *pullMarginView; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullView.m: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGPullView.h" 10 | #import "AGPullMarginView.h" 11 | #import 12 | 13 | static NSInteger const kAGPullMarginHeight = 20; 14 | static NSInteger const kAGPullMarginRoundedRectHeight = 10; 15 | static NSInteger const kAGPullMarginRoundedRectWidth = 40; 16 | 17 | @interface AGPullView () 18 | 19 | @property (strong, nonatomic, readwrite) UIView *contentView; 20 | @property (strong, nonatomic, readwrite) AGPullMarginView *pullMarginView; 21 | @property (strong, nonatomic) UIView *roundedRectView; 22 | 23 | @end 24 | 25 | @implementation AGPullView 26 | 27 | - (instancetype)initWithFrame:(CGRect)frame { 28 | if (self = [super initWithFrame:frame]) { 29 | self.backgroundColor = [UIColor blueColor]; 30 | self.opaque = NO; 31 | } 32 | 33 | return self; 34 | } 35 | 36 | - (void)p_setupSubviews { 37 | [self p_drawPullMarginView]; 38 | [self p_drawContentView]; 39 | } 40 | 41 | - (void)p_drawPullMarginView { 42 | self.pullMarginView = [[AGPullMarginView alloc] initWithFrame:CGRectZero]; 43 | self.pullMarginView.translatesAutoresizingMaskIntoConstraints = NO; 44 | self.pullMarginView.backgroundColor = [UIColor clearColor]; 45 | [self addSubview:self.pullMarginView]; 46 | 47 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.pullMarginView 48 | attribute:NSLayoutAttributeTop 49 | relatedBy:NSLayoutRelationEqual 50 | toItem:self 51 | attribute:NSLayoutAttributeTop 52 | multiplier:1 53 | constant:0]]; 54 | 55 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.pullMarginView 56 | attribute:NSLayoutAttributeTrailing 57 | relatedBy:NSLayoutRelationEqual 58 | toItem:self 59 | attribute:NSLayoutAttributeTrailing 60 | multiplier:1 61 | constant:0]]; 62 | 63 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.pullMarginView 64 | attribute:NSLayoutAttributeLeading 65 | relatedBy:NSLayoutRelationEqual 66 | toItem:self 67 | attribute:NSLayoutAttributeLeading 68 | multiplier:1 69 | constant:0]]; 70 | 71 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.pullMarginView 72 | attribute:NSLayoutAttributeHeight 73 | relatedBy:NSLayoutRelationEqual 74 | toItem:nil 75 | attribute:NSLayoutAttributeHeight 76 | multiplier:1 77 | constant:kAGPullMarginHeight]]; 78 | 79 | self.roundedRectView = [[UIView alloc] initWithFrame:CGRectZero]; 80 | self.roundedRectView.translatesAutoresizingMaskIntoConstraints = NO; 81 | self.roundedRectView.backgroundColor = [UIColor clearColor]; 82 | [self.pullMarginView addSubview:self.roundedRectView]; 83 | 84 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.roundedRectView 85 | attribute:NSLayoutAttributeCenterX 86 | relatedBy:NSLayoutRelationEqual 87 | toItem:self.pullMarginView 88 | attribute:NSLayoutAttributeCenterX 89 | multiplier:1 90 | constant:0]]; 91 | 92 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.roundedRectView 93 | attribute:NSLayoutAttributeCenterY 94 | relatedBy:NSLayoutRelationEqual 95 | toItem:self.pullMarginView 96 | attribute:NSLayoutAttributeCenterY 97 | multiplier:1 98 | constant:0]]; 99 | 100 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.roundedRectView 101 | attribute:NSLayoutAttributeHeight 102 | relatedBy:NSLayoutRelationEqual 103 | toItem:nil 104 | attribute:NSLayoutAttributeHeight 105 | multiplier:1 106 | constant:kAGPullMarginRoundedRectHeight]]; 107 | 108 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.roundedRectView 109 | attribute:NSLayoutAttributeWidth 110 | relatedBy:NSLayoutRelationEqual 111 | toItem:nil 112 | attribute:NSLayoutAttributeWidth 113 | multiplier:1 114 | constant:kAGPullMarginRoundedRectWidth]]; 115 | 116 | UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 117 | 0, 118 | kAGPullMarginRoundedRectWidth, 119 | kAGPullMarginRoundedRectHeight) 120 | cornerRadius:5]; 121 | 122 | CAShapeLayer *fillLayer = [CAShapeLayer layer]; 123 | fillLayer.path = path.CGPath; 124 | fillLayer.fillRule = kCAFillRuleEvenOdd; 125 | fillLayer.fillColor = [UIColor clearColor].CGColor; 126 | self.roundedRectView.layer.mask = fillLayer; 127 | 128 | [self p_cutOutPullMarginRoundedRect]; 129 | } 130 | 131 | - (void)p_cutOutPullMarginRoundedRect { 132 | CAShapeLayer *maskLayer = [CAShapeLayer layer]; 133 | CGMutablePathRef path = CGPathCreateMutable(); 134 | CGPathAddRect(path, nil, self.pullMarginView.bounds); 135 | CGPathAddRoundedRect(path, nil, self.roundedRectView.frame, self.roundedRectView.frame.size.height / 2, self.roundedRectView.frame.size.height / 2); 136 | maskLayer.path = path; 137 | maskLayer.fillRule = kCAFillRuleEvenOdd; 138 | 139 | self.pullMarginView.layer.mask = maskLayer; 140 | } 141 | 142 | - (void)layoutSubviews { 143 | [super layoutSubviews]; 144 | 145 | [self p_cutOutPullMarginRoundedRect]; 146 | } 147 | 148 | - (void)p_drawContentView { 149 | self.contentView = [[UIView alloc] initWithFrame:CGRectZero]; 150 | self.contentView.translatesAutoresizingMaskIntoConstraints = NO; 151 | self.contentView.backgroundColor = [UIColor clearColor]; 152 | [self addSubview:self.contentView]; 153 | 154 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView 155 | attribute:NSLayoutAttributeTop 156 | relatedBy:NSLayoutRelationEqual 157 | toItem:self.pullMarginView 158 | attribute:NSLayoutAttributeBottom 159 | multiplier:1 160 | constant:0]]; 161 | 162 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView 163 | attribute:NSLayoutAttributeTrailing 164 | relatedBy:NSLayoutRelationEqual 165 | toItem:self 166 | attribute:NSLayoutAttributeTrailing 167 | multiplier:1 168 | constant:0]]; 169 | 170 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView 171 | attribute:NSLayoutAttributeLeading 172 | relatedBy:NSLayoutRelationEqual 173 | toItem:self 174 | attribute:NSLayoutAttributeLeading 175 | multiplier:1 176 | constant:0]]; 177 | 178 | [self addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView 179 | attribute:NSLayoutAttributeBottom 180 | relatedBy:NSLayoutRelationEqual 181 | toItem:self 182 | attribute:NSLayoutAttributeBottom 183 | multiplier:1 184 | constant:0]]; 185 | } 186 | 187 | @end 188 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullViewConfigurator.h: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "AGSettingsEnums.h" 12 | #import "AGConfiguratorDelegate.h" 13 | 14 | @interface AGPullViewConfigurator : NSObject 15 | 16 | //************************************************** 17 | //* * 18 | //* In early releases of iOS 10 you will * 19 | //* have to call layoutIfNeeded to pullView * 20 | //* property to avoid incorrect layout. * 21 | //* You can find layoutPullView method in * 22 | //* configurator for this * 23 | //* * 24 | //************************************************** 25 | 26 | /*! 27 | * @brief You can access to pull view's content view with this property 28 | */ 29 | @property (strong, nonatomic, readonly) UIView *contentView; 30 | 31 | /*! 32 | * @brief You can setup one of several presets of drag margin appearences. 33 | */ 34 | @property (assign, nonatomic) PullViewColorSchemeType colorSchemeType; 35 | 36 | /*! 37 | * @brief Shows if pull view needs ability to become shown with any touch beneath it. Default - YES 38 | */ 39 | @property (assign, nonatomic) BOOL enableShowingWithTouch; 40 | 41 | /*! 42 | * @brief Shows if pull view needs ability to become hidden with any touch above it. Default - YES 43 | */ 44 | @property (assign, nonatomic) BOOL enableHidingWithTouch; 45 | 46 | /*! 47 | * @brief Duration of show/hide animation shuld be in range 0.0 - 1.0. Default - 0.3 48 | */ 49 | @property (strong, nonatomic) NSNumber *animationDuration; 50 | 51 | /*! 52 | * @brief Style of blur effect. First enable with calling "enableBlurEffectWithBlurStyle:". Then you can change blur style dynamically 53 | * @warning Makes any effect only on devices with iOS 8 or higher 54 | */ 55 | @property (assign, nonatomic) UIBlurEffectStyle blurStyle; 56 | 57 | /*! 58 | * @brief Shows if pull view need bounce effect in the end of show/hide animation. Default - NO 59 | */ 60 | @property (assign, nonatomic) BOOL needBounceEffect; 61 | 62 | /*! 63 | * @brief Delegate conforms to protocol 64 | */ 65 | @property (strong, nonatomic) id delegate; 66 | 67 | /*! 68 | * @brief Default - 100 percent. Value should be from 0 to 100. Value with 0 will be equal to default minimum height. 69 | */ 70 | @property (strong, nonatomic) NSNumber *percentOfFilling; 71 | 72 | /*! 73 | * @brief Call to add pull view to your view as subview 74 | * @param superview An UIView to which you want to add pull view as subview 75 | * @warning your view's height should be at least 100pt 76 | */ 77 | - (void)setupPullViewForSuperview:(UIView *)superview; 78 | 79 | /*! 80 | * @brief Call to add pull view to your view as subview 81 | * @param superview An UIView to which you want to add pull view as subview 82 | * @param scheme One of several presets of drag margin appearences 83 | * @warning Your view's height should be at least 100pt 84 | */ 85 | - (void)setupPullViewForSuperview:(UIView *)superview colorScheme:(PullViewColorSchemeType)scheme; 86 | 87 | /*! 88 | * @brief Call to fulfill whole pull view's content view with your view (for example UITableView). It will also add all constraints and remove all previous content view's subviews 89 | * @param view Your view which have to fullfill pull view's content view 90 | */ 91 | - (void)fullfillContentViewWithView:(UIView *)view; 92 | 93 | /*! 94 | * @brief Call to apply blur effect on pull view 95 | * @param style UIBlurEffectStyle enum value 96 | * @warning iOS 8 and higher 97 | */ 98 | - (void)enableBlurEffectWithBlurStyle:(UIBlurEffectStyle)style; 99 | 100 | /*! 101 | * @brief Call to undo blur effect which was set earlier on pull view 102 | */ 103 | - (void)undoBlurEffect; 104 | 105 | /*! 106 | * @brief Call in touchesBegan method of superview to have an ability to drag pull view 107 | * @param touches Touches recieved in your view's touchesBegan method 108 | */ 109 | - (void)handleTouchesBegan:(NSSet *)touches; 110 | 111 | /*! 112 | * @brief Call in touchesEnded method of superview to have an ability to drag pull view 113 | * @warning Do not call this method if you don't want AGPullView to be automatically hidden/showed with animation when user will stop draging 114 | * @param touches Touches recieved in your view's touchesEnded method 115 | */ 116 | - (void)handleTouchesEnded:(NSSet *)touches; 117 | 118 | /*! 119 | * @brief Call in touchesMoved method of superview to have an ability to drag pull view 120 | * @param touches Touches recieved in your view's touchesMoved method 121 | */ 122 | - (void)handleTouchesMoved:(NSSet *)touches; 123 | 124 | /*! 125 | * @brief Call to hide pull view 126 | * @param animated Choose if hiding should be animated or not 127 | */ 128 | - (void)hideAnimated:(BOOL)animated; 129 | 130 | /*! 131 | * @brief Call to show pull view 132 | * @param animated Choose if showing should be animated or not 133 | */ 134 | - (void)showAnimated:(BOOL)animated; 135 | 136 | /*! 137 | * @brief Call to show some part of pull view 138 | * @param animated Choose if showing should be animated or not 139 | * @param percent Percent of pull view which should be shown (from 0 to 100) 140 | */ 141 | - (void)showAnimated:(BOOL)animated forPercent:(NSInteger)percent; 142 | 143 | /*! 144 | * @brief Call for calling layoutIfNeeded to AGPullView 145 | */ 146 | - (void)layoutPullView; 147 | 148 | 149 | @end 150 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGPullViewConfigurator.m: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 11/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGPullViewConfigurator.h" 10 | #import "AGListViewAnimationButton.h" 11 | #import "AGPullMarginView.h" 12 | #import "AGPullView.h" 13 | 14 | //Size values 15 | #define INITIAL_HEIGHT 50 16 | #define MINIMUM_HEIGHT 50 17 | #define MINIMUM_ORIGIN_Y [self p_minimumOrigin] 18 | #define DRAG_MARGIN_HEIGHT 20 19 | #define MAXIMUM_ORIGIN_Y self.superview.frame.size.height - MINIMUM_HEIGHT 20 | #define MAXIMUM_HEIGHT self.superview.frame.size.height - MINIMUM_ORIGIN_Y 21 | 22 | //Colors 23 | #define WHITE_COLOR [UIColor colorWithRed:255./255. green:255./255. blue:255./255. alpha:1.0] 24 | #define WHITE_TRANSPARENT_COLOR [UIColor colorWithRed:255./255. green:255./255. blue:255./255. alpha:0.5] 25 | #define GRAY_COLOR [UIColor colorWithRed:192./255. green:192./255. blue:192./255. alpha:1.0] 26 | #define GRAY_TRANSPARENT_COLOR [UIColor colorWithRed:192./255. green:192./255. blue:192./255. alpha:0.5] 27 | #define DARK_GRAY_COLOR [UIColor colorWithRed:43./255. green:43./255. blue:43./255. alpha:1.0] 28 | #define DARK_TRANSPARENT_GRAY_COLOR [UIColor colorWithRed:43./255. green:43./255. blue:43./255. alpha:0.5] 29 | 30 | //iOS version checking 31 | #define IOS_8PLUS ([[UIDevice currentDevice].systemVersion intValue] >= 8) 32 | 33 | //Observed values 34 | #define SHOWING_WITH_TOUCH @"enableShowingWithTouch" 35 | #define HIDING_WITH_TOUCH @"enableHidingWithTouch" 36 | #define COLOR_SCHEME_TYPE @"colorSchemeType" 37 | #define BLUR_EFFECT @"blurStyle" 38 | 39 | typedef enum { 40 | DRAGGING, 41 | SHOWN, 42 | HIDDEN 43 | } ViewState; 44 | 45 | static NSString *const AGDirectInitEnabledFlag = @"kAGPullViewConfiguratorDirectInitEnabled"; 46 | static NSString *const AGDirectInitExeptionMessage = @"You shold use \"configurator\" singleton instead of direct initialization"; 47 | 48 | @interface AGPullViewConfigurator () 49 | 50 | @property (strong, nonatomic) AGPullView *pullView; 51 | @property (weak, nonatomic) UIView *superview; 52 | @property (strong, nonatomic) UIVisualEffectView *blurEffectView; 53 | @property (nonatomic, assign) ViewState viewState; 54 | @property (nonatomic, assign) CGFloat closedConst; 55 | @property (nonatomic, assign) CGFloat openedConst; 56 | @property (strong, nonatomic) NSLayoutConstraint *heightConst; 57 | @property (strong, nonatomic) NSLayoutConstraint *toTopConst; 58 | @property (strong, nonatomic, readwrite, getter=contentView) UIView *contentView; 59 | @property (assign, nonatomic, getter=animDuration) float animDuration; 60 | @property (assign, nonatomic, getter=needBounceEff) BOOL needBounceEff; 61 | 62 | 63 | @end 64 | 65 | @implementation AGPullViewConfigurator { 66 | ViewState _lastViewState; 67 | CGFloat oldY; 68 | BOOL dragging; 69 | AGListViewAnimationButton *upperButton; 70 | AGListViewAnimationButton *bottomButton; 71 | } 72 | 73 | - (instancetype)init { 74 | if (self = [super init]) { 75 | [self addObserver:self forKeyPath:SHOWING_WITH_TOUCH options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 76 | self.enableShowingWithTouch = true; 77 | 78 | [self addObserver:self forKeyPath:HIDING_WITH_TOUCH options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 79 | self.enableHidingWithTouch = true; 80 | 81 | [self addObserver:self forKeyPath:COLOR_SCHEME_TYPE options:NSKeyValueObservingOptionNew context:nil]; 82 | self.colorSchemeType = ColorSchemeTypeWhite; 83 | 84 | [self addObserver:self forKeyPath:BLUR_EFFECT options:NSKeyValueObservingOptionNew context:nil]; 85 | 86 | self.needBounceEffect = false; 87 | } 88 | 89 | return self; 90 | } 91 | 92 | - (void)dealloc { 93 | [self removeObserver:self forKeyPath:HIDING_WITH_TOUCH]; 94 | [self removeObserver:self forKeyPath:SHOWING_WITH_TOUCH]; 95 | [self removeObserver:self forKeyPath:COLOR_SCHEME_TYPE]; 96 | [self removeObserver:self forKeyPath:BLUR_EFFECT]; 97 | } 98 | 99 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 100 | 101 | if ([keyPath isEqualToString:SHOWING_WITH_TOUCH]) { 102 | BOOL newValue = [change[@"new"] boolValue]; 103 | BOOL oldValue = [change[@"old"] boolValue]; 104 | 105 | if (!self.superview) { 106 | return; 107 | } 108 | 109 | if (newValue && !oldValue) { 110 | [self p_setupTouchButtons]; 111 | } else if (!newValue && oldValue) { 112 | [bottomButton removeFromSuperview]; 113 | bottomButton = nil; 114 | } 115 | 116 | return; 117 | 118 | } else if ([keyPath isEqualToString:HIDING_WITH_TOUCH]) { 119 | BOOL newValue = [change[@"new"] boolValue]; 120 | BOOL oldValue = [change[@"old"] boolValue]; 121 | 122 | if (!self.superview) { 123 | return; 124 | } 125 | 126 | if (newValue && !oldValue) { 127 | [self p_setupTouchButtons]; 128 | } else if (!newValue && oldValue) { 129 | [upperButton removeFromSuperview]; 130 | upperButton = nil; 131 | } 132 | 133 | return; 134 | 135 | } else if ([keyPath isEqualToString:COLOR_SCHEME_TYPE]) { 136 | PullViewColorSchemeType newValue = [change[@"new"] intValue]; 137 | [self p_switchColorSchemeType:newValue]; 138 | return; 139 | 140 | } else if ([keyPath isEqualToString:BLUR_EFFECT]) { 141 | [self p_changeBlurEffect]; 142 | } 143 | 144 | } 145 | 146 | - (void)fullfillContentViewWithView:(UIView *)view { 147 | if (self.contentView) { 148 | 149 | for (UIView *subview in self.contentView.subviews) { 150 | [subview removeFromSuperview]; 151 | } 152 | 153 | view.translatesAutoresizingMaskIntoConstraints = NO; 154 | NSDictionary *views = NSDictionaryOfVariableBindings(view); 155 | [self.contentView addSubview:view]; 156 | [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]]; 157 | [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]]; 158 | } 159 | } 160 | 161 | - (CGFloat)p_minimumOrigin { 162 | if (self.superview && self.percentOfFilling) { 163 | CGFloat minOrigin = 40.; 164 | CGFloat maxOrigin = self.superview.bounds.size.height - 50.; 165 | CGFloat range = maxOrigin - minOrigin; 166 | 167 | CGFloat percent = [self.percentOfFilling floatValue] > 100. ? 1. : [self.percentOfFilling floatValue] / 100.; 168 | percent = percent < 0? 0 : percent; 169 | 170 | CGFloat filledAdditionalSpace = range * percent; 171 | 172 | 173 | minOrigin = minOrigin + (range - filledAdditionalSpace); 174 | return minOrigin; 175 | } else { 176 | return 40.; 177 | } 178 | } 179 | 180 | - (float)animDuration { 181 | float dur; 182 | 183 | if (!self.animationDuration) { 184 | dur = 0.3; 185 | return dur; 186 | } 187 | 188 | if ([self.animationDuration floatValue] > 0) { 189 | dur = [self.animationDuration floatValue] > 1. ? 1. : [self.animationDuration floatValue]; 190 | } else if ([self.animationDuration floatValue] == 0){ 191 | dur = 0; 192 | } else { 193 | dur = 0.3; 194 | } 195 | 196 | return dur; 197 | } 198 | 199 | - (BOOL)needBounceEff { 200 | BOOL need = self.needBounceEffect ? true : false; 201 | 202 | return need; 203 | } 204 | 205 | - (UIView * _Nullable)contentView { 206 | return self.pullView.contentView; 207 | } 208 | 209 | - (CGFloat)closedConst { 210 | return INITIAL_HEIGHT; 211 | } 212 | 213 | - (CGFloat)openedConst { 214 | return self.superview.bounds.size.height - MINIMUM_ORIGIN_Y; 215 | } 216 | 217 | #pragma mark Setting up 218 | 219 | - (void)setupPullViewForSuperview:(UIView *)superview colorScheme:(PullViewColorSchemeType)scheme { 220 | self.colorSchemeType = scheme; 221 | [self setupPullViewForSuperview:superview]; 222 | } 223 | 224 | - (void)setupPullViewForSuperview:(UIView *)superview { 225 | 226 | self.superview = superview; 227 | 228 | self.pullView = [[AGPullView alloc] initWithFrame:CGRectZero]; 229 | [self p_setupBlurEffect]; 230 | [self p_turnOffBlurEffect]; 231 | [self.pullView performSelector:@selector(p_setupSubviews)]; 232 | [self.superview addSubview:self.pullView]; 233 | self.pullView.backgroundColor = [UIColor clearColor]; 234 | 235 | //setup shadow 236 | self.pullView.layer.masksToBounds = NO; 237 | self.pullView.translatesAutoresizingMaskIntoConstraints = NO; 238 | self.pullView.layer.shadowOffset = CGSizeMake(0, -2.5); 239 | self.pullView.layer.shadowRadius = 3; 240 | self.pullView.layer.shadowOpacity = 0.2; 241 | 242 | //Default isShown state settting 243 | self.viewState = HIDDEN; 244 | 245 | [self p_configurePullView]; 246 | } 247 | 248 | - (void)p_configurePullView { 249 | 250 | if (!self.heightConst) { 251 | 252 | //Adding ListView constraints 253 | self.heightConst = [NSLayoutConstraint constraintWithItem:self.pullView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:self.closedConst]; 254 | self.heightConst.priority = 750.; //High while closed 255 | 256 | self.toTopConst = [NSLayoutConstraint constraintWithItem:self.pullView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeTop multiplier:1 constant:MAXIMUM_ORIGIN_Y]; 257 | self.toTopConst.priority = 250.; //Low while closed 258 | 259 | NSLayoutConstraint *bottomConst = [NSLayoutConstraint constraintWithItem:self.pullView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; 260 | NSLayoutConstraint *leftConst = [NSLayoutConstraint constraintWithItem:self.pullView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeLeading multiplier:1 constant:0]; 261 | NSLayoutConstraint *rightConst = [NSLayoutConstraint constraintWithItem:self.pullView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]; 262 | 263 | [self.superview addConstraints:@[self.heightConst, self.toTopConst, bottomConst, leftConst, rightConst]]; 264 | } 265 | 266 | //setup buttons for animations launching 267 | if (!upperButton && !bottomButton && self.enableShowingWithTouch && self.enableHidingWithTouch) { 268 | 269 | [self p_setupTouchButtons]; 270 | } 271 | 272 | [self p_switchColorSchemeType:self.colorSchemeType]; 273 | 274 | [self.pullView layoutIfNeeded]; 275 | [self.pullView layoutSubviews]; 276 | } 277 | 278 | - (void)p_setupTouchButtons { 279 | upperButton = [[AGListViewAnimationButton alloc] initWithFrame:CGRectZero]; 280 | upperButton.translatesAutoresizingMaskIntoConstraints = NO; 281 | [upperButton addTarget:self action:@selector(p_hideButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; 282 | upperButton.userInteractionEnabled = true; 283 | upperButton.hidden = true; 284 | 285 | bottomButton = [[AGListViewAnimationButton alloc] initWithFrame:CGRectZero]; 286 | bottomButton.translatesAutoresizingMaskIntoConstraints = NO; 287 | [bottomButton addTarget:self action:@selector(p_showButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; 288 | bottomButton.userInteractionEnabled = true; 289 | bottomButton.hidden = false; 290 | [self.superview addSubview:bottomButton]; 291 | [self.superview addSubview:upperButton]; 292 | 293 | 294 | //Adding buttons cnstraints 295 | NSDictionary *views = NSDictionaryOfVariableBindings(upperButton, bottomButton, _pullView); 296 | NSDictionary *metrics = @{@"upperButtonHeight": @(MINIMUM_ORIGIN_Y + DRAG_MARGIN_HEIGHT), @"bottomButtonHeight": @(INITIAL_HEIGHT)}; 297 | 298 | [self.superview addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[upperButton]-[_pullView]" options:NSLayoutFormatAlignAllLeft metrics:metrics views:views]]; 299 | [self.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[upperButton]|" options:NSLayoutFormatAlignAllTop metrics:metrics views:views]]; 300 | [self.superview addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottomButton(bottomButtonHeight)]|" options:NSLayoutFormatAlignAllTop metrics:metrics views:views]]; 301 | [self.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[bottomButton]|" options:NSLayoutFormatAlignAllTop metrics:metrics views:views]]; 302 | } 303 | 304 | - (void)p_switchColorSchemeType:(PullViewColorSchemeType)type { 305 | 306 | switch (type) { 307 | case ColorSchemeTypeClear: 308 | self.pullView.pullMarginView.backgroundColor = [UIColor clearColor]; 309 | self.pullView.contentView.backgroundColor = [UIColor clearColor]; 310 | break; 311 | case ColorSchemeTypeWhite: 312 | self.pullView.pullMarginView.backgroundColor = WHITE_COLOR; 313 | self.pullView.contentView.backgroundColor = WHITE_COLOR; 314 | break; 315 | case ColorSchemeTypeGray: 316 | self.pullView.pullMarginView.backgroundColor = GRAY_COLOR; 317 | self.pullView.contentView.backgroundColor = GRAY_COLOR; 318 | break; 319 | case ColorSchemeTypeDark: 320 | self.pullView.pullMarginView.backgroundColor = DARK_GRAY_COLOR; 321 | self.pullView.contentView.backgroundColor = DARK_GRAY_COLOR; 322 | break; 323 | case ColorSchemeTypeWhiteTransparent: 324 | self.pullView.pullMarginView.backgroundColor = WHITE_TRANSPARENT_COLOR; 325 | self.pullView.contentView.backgroundColor = WHITE_TRANSPARENT_COLOR; 326 | break; 327 | case ColorSchemeTypeGrayTransparent: 328 | self.pullView.pullMarginView.backgroundColor = GRAY_TRANSPARENT_COLOR; 329 | self.pullView.contentView.backgroundColor = GRAY_TRANSPARENT_COLOR; 330 | break; 331 | case ColorSchemeTypeDarkTransparent: 332 | self.pullView.pullMarginView.backgroundColor = DARK_TRANSPARENT_GRAY_COLOR; 333 | self.pullView.contentView.backgroundColor = DARK_TRANSPARENT_GRAY_COLOR; 334 | break; 335 | default: 336 | break; 337 | } 338 | } 339 | 340 | - (void)enableBlurEffectWithBlurStyle:(UIBlurEffectStyle)style { 341 | self.blurStyle = style; 342 | [self p_turnOnBlurEffect]; 343 | } 344 | 345 | - (void)undoBlurEffect { 346 | [self p_turnOffBlurEffect]; 347 | } 348 | 349 | - (void)p_setupBlurEffect { 350 | if (!UIAccessibilityIsReduceTransparencyEnabled() && 351 | IOS_8PLUS) { 352 | 353 | UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:self.blurStyle]; 354 | 355 | if (!self.blurEffectView) { 356 | self.blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 357 | 358 | self.blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; 359 | self.blurEffectView.frame = CGRectZero; 360 | self.blurEffectView.translatesAutoresizingMaskIntoConstraints = NO; 361 | [self.pullView addSubview:self.blurEffectView]; 362 | 363 | [self.pullView addConstraint:[NSLayoutConstraint constraintWithItem:_blurEffectView 364 | attribute:NSLayoutAttributeTop 365 | relatedBy:NSLayoutRelationEqual 366 | toItem:_pullView 367 | attribute:NSLayoutAttributeTop 368 | multiplier:1 369 | constant:0]]; 370 | 371 | [self.pullView addConstraint:[NSLayoutConstraint constraintWithItem:_blurEffectView 372 | attribute:NSLayoutAttributeTrailing 373 | relatedBy:NSLayoutRelationEqual 374 | toItem:_pullView 375 | attribute:NSLayoutAttributeTrailing 376 | multiplier:1 377 | constant:0]]; 378 | 379 | [self.pullView addConstraint:[NSLayoutConstraint constraintWithItem:_blurEffectView 380 | attribute:NSLayoutAttributeLeading 381 | relatedBy:NSLayoutRelationEqual 382 | toItem:_pullView 383 | attribute:NSLayoutAttributeLeading 384 | multiplier:1 385 | constant:0]]; 386 | 387 | [self.pullView addConstraint:[NSLayoutConstraint constraintWithItem:_blurEffectView 388 | attribute:NSLayoutAttributeBottom 389 | relatedBy:NSLayoutRelationEqual 390 | toItem:_pullView 391 | attribute:NSLayoutAttributeBottom 392 | multiplier:1 393 | constant:0]]; 394 | } 395 | } 396 | } 397 | 398 | - (void)p_turnOnBlurEffect { 399 | if (IOS_8PLUS) { 400 | if (self.blurEffectView) { 401 | self.blurEffectView.hidden = false; 402 | } 403 | } 404 | } 405 | 406 | - (void)p_turnOffBlurEffect { 407 | if (IOS_8PLUS) { 408 | if (self.blurEffectView) { 409 | self.blurEffectView.hidden = true; 410 | } 411 | } 412 | } 413 | 414 | - (void)p_changeBlurEffect { 415 | if (IOS_8PLUS) { 416 | UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:self.blurStyle]; 417 | 418 | if (self.blurEffectView) { 419 | self.blurEffectView.effect = blurEffect; 420 | } 421 | } 422 | } 423 | 424 | #pragma mark - Button Actions 425 | 426 | - (void)p_hideButtonTouched:(id)sender { 427 | 428 | if ([self.delegate respondsToSelector:@selector(didTouchToHidePullView:)]) { 429 | [self.delegate didTouchToHidePullView:self.pullView]; 430 | } 431 | 432 | [self hideAnimated:true]; 433 | } 434 | 435 | - (void)p_showButtonTouched:(id)sender { 436 | 437 | if ([self.delegate respondsToSelector:@selector(didTouchToShowPullView:)]) { 438 | [self.delegate didTouchToShowPullView:self.pullView]; 439 | } 440 | 441 | [self showAnimated:true]; 442 | } 443 | 444 | #pragma mark - Animations 445 | //Hides self with animation 446 | - (void)hideAnimated:(BOOL)animated { 447 | 448 | if (animated) { 449 | 450 | float bounce = self.needBounceEff ? 0.7 : 1.; 451 | 452 | [UIView animateWithDuration:self.animDuration 453 | delay:0. 454 | usingSpringWithDamping:bounce 455 | initialSpringVelocity:0 456 | options:UIViewAnimationOptionCurveEaseOut 457 | animations:^{ 458 | 459 | self.heightConst.priority = 750.; //High while closed 460 | self.heightConst.constant = self.closedConst; 461 | 462 | self.toTopConst.priority = 250.; //Low while closed 463 | self.toTopConst.constant = MAXIMUM_ORIGIN_Y; 464 | 465 | [self.superview layoutIfNeeded]; 466 | 467 | 468 | } completion:^(BOOL finished) { 469 | 470 | self.viewState = HIDDEN; 471 | 472 | if ([self.delegate respondsToSelector:@selector(didHidePullView:)]) { 473 | [self.delegate didHidePullView:self.pullView]; 474 | } 475 | 476 | [self p_switchButtons]; 477 | 478 | }]; 479 | 480 | } else { 481 | [self p_setupToHiddenState]; 482 | } 483 | } 484 | 485 | //Opens self with animation 486 | - (void)showAnimated:(BOOL)animated { 487 | [self p_showAnimated:animated completionAction:nil]; 488 | } 489 | 490 | - (void)p_showAnimated:(BOOL)animated completionAction:(void(^)(void))completionAction { 491 | if (animated) { 492 | float bounce = self.needBounceEff ? 0.7 : 1.; 493 | 494 | dispatch_async(dispatch_get_main_queue(), ^{ 495 | [UIView animateWithDuration:self.animDuration 496 | delay:0. 497 | usingSpringWithDamping:bounce 498 | initialSpringVelocity:0 499 | options:UIViewAnimationOptionCurveEaseOut 500 | animations:^{ 501 | 502 | self.heightConst.priority = 250.; //Low while opened 503 | self.heightConst.constant = self.openedConst; 504 | 505 | self.toTopConst.priority = 750.; //High while opened 506 | self.toTopConst.constant = MINIMUM_ORIGIN_Y; 507 | 508 | [self.superview layoutIfNeeded]; 509 | 510 | } completion:^(BOOL finished) { 511 | 512 | self.viewState = SHOWN; 513 | 514 | if ([self.delegate respondsToSelector:@selector(didShowPullView:)]) { 515 | [self.delegate didShowPullView:self.pullView]; 516 | } 517 | 518 | [self p_switchButtons]; 519 | 520 | if (completionAction) { 521 | completionAction(); 522 | } 523 | 524 | }]; 525 | }); 526 | } else { 527 | [self p_setupToShownState]; 528 | } 529 | } 530 | 531 | - (void)showAnimated:(BOOL)animated forPercent:(NSInteger)percent { 532 | NSNumber *savedPrecent = [self.percentOfFilling copy]; 533 | percent = percent > 0 ? percent : 0; 534 | percent = percent < 100 ? percent : 100; 535 | CGFloat multiplier = percent / 100.; 536 | NSNumber *tmpPercent = @([self.percentOfFilling floatValue] * multiplier); 537 | self.percentOfFilling = tmpPercent; 538 | __weak typeof(self) welf = self; 539 | 540 | [self p_showAnimated:animated completionAction:^{ 541 | welf.percentOfFilling = savedPrecent; 542 | }]; 543 | } 544 | - (void)p_switchButtons { 545 | if (self.viewState == HIDDEN) { 546 | upperButton.hidden = true; 547 | bottomButton.hidden = false; 548 | } else if (self.viewState == SHOWN) { 549 | upperButton.hidden = false; 550 | bottomButton.hidden = true; 551 | } 552 | } 553 | 554 | - (void)p_setupToShownState { 555 | self.heightConst.priority = 250.; //Low while opened 556 | self.heightConst.constant = self.openedConst; 557 | self.toTopConst.priority = 750.; //High while opened 558 | self.toTopConst.constant = MINIMUM_ORIGIN_Y; 559 | 560 | if (self.viewState != SHOWN) { 561 | 562 | if ([self.delegate respondsToSelector:@selector(didShowPullView:)]) { 563 | [self.delegate didShowPullView:self.pullView]; 564 | } 565 | } 566 | 567 | self.viewState = SHOWN; 568 | [self p_switchButtons]; 569 | } 570 | 571 | - (void)p_setupToHiddenState { 572 | self.heightConst.priority = 750.; //High while closed 573 | self.heightConst.constant = self.closedConst; 574 | self.toTopConst.priority = 250.; //Low while closed 575 | self.toTopConst.constant = MAXIMUM_ORIGIN_Y; 576 | 577 | if (self.viewState != HIDDEN) { 578 | 579 | if ([self.delegate respondsToSelector:@selector(didHidePullView:)]) { 580 | [self.delegate didHidePullView:self.pullView]; 581 | } 582 | } 583 | 584 | self.viewState = HIDDEN; 585 | [self p_switchButtons]; 586 | } 587 | 588 | #pragma mark - Messages from controller 589 | 590 | - (void)handleTouchesBegan:(NSSet *)touches { 591 | UITouch *touch = [[touches allObjects] lastObject]; 592 | CGPoint touchLocation = [touch locationInView:self.pullView]; 593 | 594 | //Recognize touch on ImageView on top of List view 595 | switch (self.viewState) { 596 | case HIDDEN: 597 | { 598 | BOOL pulling = [[touch.view class] isSubclassOfClass:[AGListViewAnimationButton class]] || 599 | [[touch.view class] isSubclassOfClass:[AGPullMarginView class]] || 600 | [[[touch.view superview] class] isSubclassOfClass:[AGPullMarginView class]]; 601 | 602 | if (pulling) { 603 | dragging = YES; 604 | oldY = touchLocation.y; 605 | } 606 | break; 607 | } 608 | case SHOWN: 609 | { 610 | BOOL pulling = [[touch.view class] isSubclassOfClass:[AGPullMarginView class]] || 611 | [[[touch.view superview] class] isSubclassOfClass:[AGPullMarginView class]]; 612 | 613 | if (pulling) { 614 | dragging = YES; 615 | oldY = touchLocation.y; 616 | } 617 | break; 618 | } 619 | default: 620 | break; 621 | } 622 | } 623 | 624 | - (void)handleTouchesEnded:(NSSet *)touches { 625 | CGPoint point = [[[touches allObjects] lastObject] locationInView:self.superview]; 626 | 627 | if (!dragging) { 628 | return; 629 | } 630 | 631 | CGFloat pointOfStep = self.superview.bounds.size.height - ((MAXIMUM_ORIGIN_Y - MINIMUM_ORIGIN_Y) / 2.); 632 | if (_lastViewState == SHOWN) { 633 | pointOfStep = self.superview.bounds.size.height - ((MAXIMUM_ORIGIN_Y - MINIMUM_ORIGIN_Y) / 1.0); 634 | } else if (_lastViewState == HIDDEN) { 635 | pointOfStep = self.superview.bounds.size.height - ((MAXIMUM_ORIGIN_Y - MINIMUM_ORIGIN_Y) / 4.0); 636 | } 637 | 638 | if (self.heightConst.constant == MAXIMUM_HEIGHT || 639 | self.heightConst.constant == MINIMUM_HEIGHT) { 640 | return; 641 | } 642 | 643 | if (point.y > pointOfStep) { 644 | [self hideAnimated:true]; 645 | } else { 646 | [self showAnimated:true]; 647 | } 648 | 649 | dragging = NO; 650 | } 651 | 652 | - (void)handleTouchesMoved:(NSSet *)touches { 653 | UITouch *touch = [[touches allObjects] lastObject]; 654 | 655 | //Recognize touch on ImageView on top of List view 656 | BOOL pullingView = [[touch.view class] isSubclassOfClass:[AGListViewAnimationButton class]] || 657 | [[touch.view class] isSubclassOfClass:[AGPullMarginView class]] || 658 | [[[touch.view superview] class] isSubclassOfClass:[AGPullMarginView class]]; 659 | 660 | if (pullingView) { 661 | 662 | //User drags list view in the moment 663 | if (dragging) { 664 | CGPoint touchLocation = [touch locationInView:self.pullView]; 665 | float deltaY = touchLocation.y - oldY; 666 | 667 | //Expected height constraint value 668 | CGFloat height = fabs(self.heightConst.constant + -deltaY); 669 | 670 | //Expected TopToTop constraint value 671 | CGFloat topConst = fabs(self.toTopConst.constant + deltaY); 672 | 673 | if (height > MAXIMUM_HEIGHT) { //Blocks pulling view lower than maximum Y (hidden state) 674 | self.heightConst.constant = MAXIMUM_HEIGHT; 675 | self.toTopConst.constant = MINIMUM_ORIGIN_Y; 676 | [self p_setupToShownState]; 677 | } else if (height < MINIMUM_HEIGHT) { //Blocks pulling view higher than minimum Y (shown state) 678 | self.heightConst.constant = MINIMUM_HEIGHT; 679 | self.toTopConst.constant = MAXIMUM_ORIGIN_Y; 680 | [self p_setupToHiddenState]; 681 | } else { 682 | 683 | //Setup last view state before dragging began 684 | if (self.viewState != DRAGGING) { 685 | _lastViewState = self.viewState; 686 | } 687 | 688 | self.viewState = DRAGGING; 689 | 690 | if ([self.delegate respondsToSelector:@selector(didDragPullView:withOpeningPercent:)]) { 691 | [self.delegate didDragPullView:self.pullView 692 | withOpeningPercent:[self countOpeningPercentWithHeight:height]]; 693 | } 694 | 695 | //Just assign constraints new values 696 | self.heightConst.constant = height; 697 | self.toTopConst.constant = topConst; 698 | } 699 | 700 | // self.listView.frame = frame; 701 | [self.pullView layoutIfNeeded]; 702 | } 703 | } 704 | } 705 | 706 | - (float)countOpeningPercentWithHeight:(CGFloat)height { 707 | CGFloat possibleRange = self.superview.bounds.size.height - MINIMUM_ORIGIN_Y - MINIMUM_HEIGHT; 708 | CGFloat currentChange = height - MINIMUM_HEIGHT; 709 | float percent = currentChange / possibleRange; 710 | return percent; 711 | } 712 | 713 | - (void)layoutPullView { 714 | [self.pullView layoutIfNeeded]; 715 | [self.pullView layoutSubviews]; 716 | } 717 | 718 | @end 719 | -------------------------------------------------------------------------------- /AGPullView/Classes/AGSettingsEnums.h: -------------------------------------------------------------------------------- 1 | // 2 | // AGSettingsEnums.h 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 12/06/16. 6 | // Copyright © 2016 Alexey Getman. All rights reserved. 7 | // 8 | #import 9 | 10 | #ifndef AGSettingsEnums_h 11 | #define AGSettingsEnums_h 12 | 13 | typedef enum { 14 | ColorSchemeTypeClear, 15 | ColorSchemeTypeWhite, 16 | ColorSchemeTypeGray, 17 | ColorSchemeTypeDark, 18 | ColorSchemeTypeWhiteTransparent, 19 | ColorSchemeTypeGrayTransparent, 20 | ColorSchemeTypeDarkTransparent 21 | } PullViewColorSchemeType; 22 | 23 | #endif /* AGSettingsEnums_h */ 24 | -------------------------------------------------------------------------------- /Example/AGPullView Swift/AGPullView_Example-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "AGPullViewConfigurator.h" 6 | #import "AGPullView.h" 7 | #import "AGConfiguratorDelegate.h" 8 | -------------------------------------------------------------------------------- /Example/AGPullView Swift/AGViewControllerSwift.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AGViewController.swift 3 | // AGPullView 4 | // 5 | // Created by Alexey Getman on 26/09/2016. 6 | // Copyright © 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AGViewControllerSwift: UIViewController, AGConfiguratorDelegate, UITableViewDataSource { 12 | 13 | let configurator = AGPullViewConfigurator() 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | 18 | //AGPullView configuration 19 | self.configurator.setupPullView(forSuperview: self.view, colorScheme:ColorSchemeTypeDarkTransparent) 20 | self.configurator.percentOfFilling = 85 21 | self.configurator.delegate = self 22 | self.configurator.needBounceEffect = true 23 | self.configurator.animationDuration = 0.3 24 | self.configurator.enableShowingWithTouch = true; 25 | self.configurator.enableHidingWithTouch = false; 26 | self.configurator.enableBlurEffect(withBlurStyle: .dark) 27 | 28 | //Test UITableView 29 | let table = UITableView(frame: CGRect(), style: .grouped) 30 | table.dataSource = self 31 | table.separatorStyle = .none; 32 | table.backgroundColor = UIColor.clear 33 | 34 | //Filling whole AGPullView with test UITableView 35 | self.configurator.fullfillContentView(with: table) 36 | } 37 | 38 | //For correct working of layout in early versions of iOS 10 39 | override func viewDidLayoutSubviews() { 40 | super.viewDidLayoutSubviews() 41 | self.configurator.layoutPullView() 42 | } 43 | 44 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 | return 5 46 | } 47 | 48 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 49 | let cell = UITableViewCell() 50 | cell.backgroundColor = UIColor.clear 51 | cell.textLabel?.textColor = UIColor.red 52 | cell.textLabel?.text = "Test" 53 | return cell; 54 | } 55 | 56 | override func touchesBegan(_ touches: Set, with event: UIEvent?) { 57 | self.configurator.handleTouchesBegan(touches) 58 | } 59 | 60 | override func touchesMoved(_ touches: Set, with event: UIEvent?) { 61 | self.configurator.handleTouchesMoved(touches) 62 | } 63 | 64 | override func touchesEnded(_ touches: Set, with event: UIEvent?) { 65 | self.configurator.handleTouchesEnded(touches) 66 | } 67 | 68 | func didDrag(_ pullView: AGPullView!, withOpeningPercent openingPercent: Float) { 69 | print("\(openingPercent)") 70 | } 71 | 72 | func didShow(_ pullView: AGPullView!) { 73 | print("shown"); 74 | } 75 | 76 | func didHide(_ pullView: AGPullView!) { 77 | print("hidden") 78 | } 79 | func didTouch(toShow pullView: AGPullView!) { 80 | print("touched to show") 81 | } 82 | 83 | func didTouch(toHide pullView: AGPullView!) { 84 | print("touched to hide") 85 | } 86 | 87 | @IBAction func backToObjCController(_ sender: AnyObject) { 88 | self.dismiss(animated: true, completion: nil) 89 | } 90 | 91 | @IBAction func changeAppearenceToRandom(_ sender: AnyObject) { 92 | let randomBlur = arc4random_uniform(2) 93 | self.configurator.blurStyle = UIBlurEffectStyle(rawValue: Int(randomBlur))! 94 | 95 | let randomColorScheme = arc4random_uniform(6) 96 | self.configurator.colorSchemeType = PullViewColorSchemeType(rawValue: randomColorScheme) 97 | } 98 | 99 | 100 | } 101 | -------------------------------------------------------------------------------- /Example/AGPullView Swift/SwiftExample.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 | 36 | 46 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /Example/AGPullView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 11 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; 12 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 13 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; 14 | 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; 15 | 6003F59E195388D20070C39A /* AGAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* AGAppDelegate.m */; }; 16 | 6003F5A7195388D20070C39A /* AGViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* AGViewController.m */; }; 17 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; 18 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; 19 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; 20 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; 21 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; 22 | 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; 23 | 6B0070871D99ACCB00153763 /* SwiftExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6B0070861D99ACCB00153763 /* SwiftExample.storyboard */; }; 24 | 6B164B2F1D99A2C20021FAB6 /* AGViewControllerSwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B164B2E1D99A2C20021FAB6 /* AGViewControllerSwift.swift */; }; 25 | 6B4FFC211D3A56C0009F86D6 /* AGViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6B4FFC201D3A56C0009F86D6 /* AGViewController.xib */; }; 26 | 6BCC2CD21D99A66B0036D1E4 /* AGPullView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BCC2CD11D99A66B0036D1E4 /* AGPullView.framework */; }; 27 | 7CA15DE23A495E52B8358891 /* Pods_AGPullView_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D625CD00E4F741008002DF18 /* Pods_AGPullView_Example.framework */; }; 28 | 9234E0DE062328779F73DFEE /* Pods_AGPullView_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89B5768D73406543E032DE13 /* Pods_AGPullView_Tests.framework */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 6003F582195388D10070C39A /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 6003F589195388D20070C39A; 37 | remoteInfo = AGPullView; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 389CFE9FDB2DFF080274D7A9 /* Pods-AGPullView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AGPullView_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example.release.xcconfig"; sourceTree = ""; }; 43 | 542102A67614AE671622C134 /* AGPullView.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = AGPullView.podspec; path = ../AGPullView.podspec; sourceTree = ""; }; 44 | 6003F58A195388D20070C39A /* AGPullView_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AGPullView_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 46 | 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 47 | 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 48 | 6003F595195388D20070C39A /* AGPullView-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AGPullView-Info.plist"; sourceTree = ""; }; 49 | 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 50 | 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 51 | 6003F59B195388D20070C39A /* AGPullView-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AGPullView-Prefix.pch"; sourceTree = ""; }; 52 | 6003F59C195388D20070C39A /* AGAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGAppDelegate.h; sourceTree = ""; }; 53 | 6003F59D195388D20070C39A /* AGAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGAppDelegate.m; sourceTree = ""; }; 54 | 6003F5A5195388D20070C39A /* AGViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AGViewController.h; sourceTree = ""; }; 55 | 6003F5A6195388D20070C39A /* AGViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AGViewController.m; sourceTree = ""; }; 56 | 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 57 | 6003F5AE195388D20070C39A /* AGPullView_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AGPullView_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 59 | 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 60 | 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 61 | 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 62 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; 63 | 61BE7F5E0C1DBBD718C8F06D /* Pods_AGPullView_Example_AGPullView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AGPullView_Example_AGPullView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | 6B0070861D99ACCB00153763 /* SwiftExample.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SwiftExample.storyboard; path = "AGPullView Swift/SwiftExample.storyboard"; sourceTree = ""; }; 65 | 6B164B2D1D99A2C10021FAB6 /* AGPullView_Example-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "AGPullView_Example-Bridging-Header.h"; path = "AGPullView Swift/AGPullView_Example-Bridging-Header.h"; sourceTree = ""; }; 66 | 6B164B2E1D99A2C20021FAB6 /* AGViewControllerSwift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AGViewControllerSwift.swift; path = "AGPullView Swift/AGViewControllerSwift.swift"; sourceTree = ""; }; 67 | 6B164B301D99A3D30021FAB6 /* AGPullView.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGPullView.framework; path = "../../../../Library/Developer/Xcode/DerivedData/AGPullView-beplgtedzdgkfnaerzkknxpupgqv/Build/Products/Debug-iphonesimulator/AGPullView.framework"; sourceTree = ""; }; 68 | 6B4FFC201D3A56C0009F86D6 /* AGViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AGViewController.xib; sourceTree = ""; }; 69 | 6BCC2CD11D99A66B0036D1E4 /* AGPullView.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGPullView.framework; path = "../../../../Library/Developer/Xcode/DerivedData/AGPullView-beplgtedzdgkfnaerzkknxpupgqv/Build/Products/Debug-iphonesimulator/AGPullView/AGPullView.framework"; sourceTree = ""; }; 70 | 7CB81E15FA4B2F7014F0406E /* Pods-AGPullView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AGPullView_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests.release.xcconfig"; sourceTree = ""; }; 71 | 89B5768D73406543E032DE13 /* Pods_AGPullView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AGPullView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | C85C2F816BA7344A8DBCB6EE /* Pods-AGPullView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AGPullView_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests.debug.xcconfig"; sourceTree = ""; }; 73 | D625CD00E4F741008002DF18 /* Pods_AGPullView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AGPullView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74 | E3C23D59ADDD1762EC25679D /* Pods-AGPullView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AGPullView_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example.debug.xcconfig"; sourceTree = ""; }; 75 | EC3308844AC570E03FBD01BC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 76 | F97C53545E8A76207A2E1453 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 77 | /* End PBXFileReference section */ 78 | 79 | /* Begin PBXFrameworksBuildPhase section */ 80 | 6003F587195388D20070C39A /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | 6BCC2CD21D99A66B0036D1E4 /* AGPullView.framework in Frameworks */, 85 | 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, 86 | 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, 87 | 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, 88 | 7CA15DE23A495E52B8358891 /* Pods_AGPullView_Example.framework in Frameworks */, 89 | ); 90 | runOnlyForDeploymentPostprocessing = 0; 91 | }; 92 | 6003F5AB195388D20070C39A /* Frameworks */ = { 93 | isa = PBXFrameworksBuildPhase; 94 | buildActionMask = 2147483647; 95 | files = ( 96 | 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, 97 | 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, 98 | 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, 99 | 9234E0DE062328779F73DFEE /* Pods_AGPullView_Tests.framework in Frameworks */, 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | /* End PBXFrameworksBuildPhase section */ 104 | 105 | /* Begin PBXGroup section */ 106 | 0A98F55A6C899D85A6F12E70 /* Pods */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | E3C23D59ADDD1762EC25679D /* Pods-AGPullView_Example.debug.xcconfig */, 110 | 389CFE9FDB2DFF080274D7A9 /* Pods-AGPullView_Example.release.xcconfig */, 111 | C85C2F816BA7344A8DBCB6EE /* Pods-AGPullView_Tests.debug.xcconfig */, 112 | 7CB81E15FA4B2F7014F0406E /* Pods-AGPullView_Tests.release.xcconfig */, 113 | ); 114 | name = Pods; 115 | sourceTree = ""; 116 | }; 117 | 6003F581195388D10070C39A = { 118 | isa = PBXGroup; 119 | children = ( 120 | 6B164B2C1D99A2470021FAB6 /* Swift example for AGPullView */, 121 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, 122 | 6003F593195388D20070C39A /* Example for AGPullView */, 123 | 6003F5B5195388D20070C39A /* Tests */, 124 | 6003F58C195388D20070C39A /* Frameworks */, 125 | 6003F58B195388D20070C39A /* Products */, 126 | 0A98F55A6C899D85A6F12E70 /* Pods */, 127 | ); 128 | sourceTree = ""; 129 | }; 130 | 6003F58B195388D20070C39A /* Products */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 6003F58A195388D20070C39A /* AGPullView_Example.app */, 134 | 6003F5AE195388D20070C39A /* AGPullView_Tests.xctest */, 135 | ); 136 | name = Products; 137 | sourceTree = ""; 138 | }; 139 | 6003F58C195388D20070C39A /* Frameworks */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 6BCC2CD11D99A66B0036D1E4 /* AGPullView.framework */, 143 | 6B164B301D99A3D30021FAB6 /* AGPullView.framework */, 144 | 6003F58D195388D20070C39A /* Foundation.framework */, 145 | 6003F58F195388D20070C39A /* CoreGraphics.framework */, 146 | 6003F591195388D20070C39A /* UIKit.framework */, 147 | 6003F5AF195388D20070C39A /* XCTest.framework */, 148 | D625CD00E4F741008002DF18 /* Pods_AGPullView_Example.framework */, 149 | 61BE7F5E0C1DBBD718C8F06D /* Pods_AGPullView_Example_AGPullView_Tests.framework */, 150 | 89B5768D73406543E032DE13 /* Pods_AGPullView_Tests.framework */, 151 | ); 152 | name = Frameworks; 153 | sourceTree = ""; 154 | }; 155 | 6003F593195388D20070C39A /* Example for AGPullView */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 6003F59C195388D20070C39A /* AGAppDelegate.h */, 159 | 6003F59D195388D20070C39A /* AGAppDelegate.m */, 160 | 6003F5A5195388D20070C39A /* AGViewController.h */, 161 | 6003F5A6195388D20070C39A /* AGViewController.m */, 162 | 6B4FFC201D3A56C0009F86D6 /* AGViewController.xib */, 163 | 6003F5A8195388D20070C39A /* Images.xcassets */, 164 | 6003F594195388D20070C39A /* Supporting Files */, 165 | ); 166 | name = "Example for AGPullView"; 167 | path = AGPullView; 168 | sourceTree = ""; 169 | }; 170 | 6003F594195388D20070C39A /* Supporting Files */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 6003F595195388D20070C39A /* AGPullView-Info.plist */, 174 | 6003F596195388D20070C39A /* InfoPlist.strings */, 175 | 6003F599195388D20070C39A /* main.m */, 176 | 6003F59B195388D20070C39A /* AGPullView-Prefix.pch */, 177 | ); 178 | name = "Supporting Files"; 179 | sourceTree = ""; 180 | }; 181 | 6003F5B5195388D20070C39A /* Tests */ = { 182 | isa = PBXGroup; 183 | children = ( 184 | 6003F5BB195388D20070C39A /* Tests.m */, 185 | 6003F5B6195388D20070C39A /* Supporting Files */, 186 | ); 187 | path = Tests; 188 | sourceTree = ""; 189 | }; 190 | 6003F5B6195388D20070C39A /* Supporting Files */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 6003F5B7195388D20070C39A /* Tests-Info.plist */, 194 | 6003F5B8195388D20070C39A /* InfoPlist.strings */, 195 | 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, 196 | ); 197 | name = "Supporting Files"; 198 | sourceTree = ""; 199 | }; 200 | 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 542102A67614AE671622C134 /* AGPullView.podspec */, 204 | EC3308844AC570E03FBD01BC /* README.md */, 205 | F97C53545E8A76207A2E1453 /* LICENSE */, 206 | ); 207 | name = "Podspec Metadata"; 208 | sourceTree = ""; 209 | }; 210 | 6B164B2C1D99A2470021FAB6 /* Swift example for AGPullView */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 6B164B2D1D99A2C10021FAB6 /* AGPullView_Example-Bridging-Header.h */, 214 | 6B164B2E1D99A2C20021FAB6 /* AGViewControllerSwift.swift */, 215 | 6B0070861D99ACCB00153763 /* SwiftExample.storyboard */, 216 | ); 217 | name = "Swift example for AGPullView"; 218 | sourceTree = ""; 219 | }; 220 | /* End PBXGroup section */ 221 | 222 | /* Begin PBXNativeTarget section */ 223 | 6003F589195388D20070C39A /* AGPullView_Example */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "AGPullView_Example" */; 226 | buildPhases = ( 227 | 926CCC2856F88693C91E24FF /* [CP] Check Pods Manifest.lock */, 228 | 6003F586195388D20070C39A /* Sources */, 229 | 6003F587195388D20070C39A /* Frameworks */, 230 | 6003F588195388D20070C39A /* Resources */, 231 | 281B0B95D55566358F2A0BBA /* [CP] Embed Pods Frameworks */, 232 | 38856316B4F5D5C135AC10C8 /* [CP] Copy Pods Resources */, 233 | ); 234 | buildRules = ( 235 | ); 236 | dependencies = ( 237 | ); 238 | name = AGPullView_Example; 239 | productName = AGPullView; 240 | productReference = 6003F58A195388D20070C39A /* AGPullView_Example.app */; 241 | productType = "com.apple.product-type.application"; 242 | }; 243 | 6003F5AD195388D20070C39A /* AGPullView_Tests */ = { 244 | isa = PBXNativeTarget; 245 | buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "AGPullView_Tests" */; 246 | buildPhases = ( 247 | 149A26B72A864044A6E2118B /* [CP] Check Pods Manifest.lock */, 248 | 6003F5AA195388D20070C39A /* Sources */, 249 | 6003F5AB195388D20070C39A /* Frameworks */, 250 | 6003F5AC195388D20070C39A /* Resources */, 251 | 83D1C3B9FAAFB290A8EBCC7E /* [CP] Embed Pods Frameworks */, 252 | 1B7FA7E16B5E0A27D9753C1F /* [CP] Copy Pods Resources */, 253 | ); 254 | buildRules = ( 255 | ); 256 | dependencies = ( 257 | 6003F5B4195388D20070C39A /* PBXTargetDependency */, 258 | ); 259 | name = AGPullView_Tests; 260 | productName = AGPullViewTests; 261 | productReference = 6003F5AE195388D20070C39A /* AGPullView_Tests.xctest */; 262 | productType = "com.apple.product-type.bundle.unit-test"; 263 | }; 264 | /* End PBXNativeTarget section */ 265 | 266 | /* Begin PBXProject section */ 267 | 6003F582195388D10070C39A /* Project object */ = { 268 | isa = PBXProject; 269 | attributes = { 270 | CLASSPREFIX = AG; 271 | LastUpgradeCheck = 0800; 272 | ORGANIZATIONNAME = "Aleksey Getman"; 273 | TargetAttributes = { 274 | 6003F589195388D20070C39A = { 275 | LastSwiftMigration = 0800; 276 | }; 277 | 6003F5AD195388D20070C39A = { 278 | TestTargetID = 6003F589195388D20070C39A; 279 | }; 280 | }; 281 | }; 282 | buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "AGPullView" */; 283 | compatibilityVersion = "Xcode 3.2"; 284 | developmentRegion = English; 285 | hasScannedForEncodings = 0; 286 | knownRegions = ( 287 | en, 288 | Base, 289 | ); 290 | mainGroup = 6003F581195388D10070C39A; 291 | productRefGroup = 6003F58B195388D20070C39A /* Products */; 292 | projectDirPath = ""; 293 | projectRoot = ""; 294 | targets = ( 295 | 6003F589195388D20070C39A /* AGPullView_Example */, 296 | 6003F5AD195388D20070C39A /* AGPullView_Tests */, 297 | ); 298 | }; 299 | /* End PBXProject section */ 300 | 301 | /* Begin PBXResourcesBuildPhase section */ 302 | 6003F588195388D20070C39A /* Resources */ = { 303 | isa = PBXResourcesBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, 307 | 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, 308 | 6B4FFC211D3A56C0009F86D6 /* AGViewController.xib in Resources */, 309 | 6B0070871D99ACCB00153763 /* SwiftExample.storyboard in Resources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | 6003F5AC195388D20070C39A /* Resources */ = { 314 | isa = PBXResourcesBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | /* End PBXResourcesBuildPhase section */ 322 | 323 | /* Begin PBXShellScriptBuildPhase section */ 324 | 149A26B72A864044A6E2118B /* [CP] Check Pods Manifest.lock */ = { 325 | isa = PBXShellScriptBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | ); 329 | inputPaths = ( 330 | ); 331 | name = "[CP] Check Pods Manifest.lock"; 332 | outputPaths = ( 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | shellPath = /bin/sh; 336 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 337 | showEnvVarsInLog = 0; 338 | }; 339 | 1B7FA7E16B5E0A27D9753C1F /* [CP] Copy Pods Resources */ = { 340 | isa = PBXShellScriptBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | ); 344 | inputPaths = ( 345 | ); 346 | name = "[CP] Copy Pods Resources"; 347 | outputPaths = ( 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | shellPath = /bin/sh; 351 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests-resources.sh\"\n"; 352 | showEnvVarsInLog = 0; 353 | }; 354 | 281B0B95D55566358F2A0BBA /* [CP] Embed Pods Frameworks */ = { 355 | isa = PBXShellScriptBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | ); 359 | inputPaths = ( 360 | ); 361 | name = "[CP] Embed Pods Frameworks"; 362 | outputPaths = ( 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | shellPath = /bin/sh; 366 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example-frameworks.sh\"\n"; 367 | showEnvVarsInLog = 0; 368 | }; 369 | 38856316B4F5D5C135AC10C8 /* [CP] Copy Pods Resources */ = { 370 | isa = PBXShellScriptBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | inputPaths = ( 375 | ); 376 | name = "[CP] Copy Pods Resources"; 377 | outputPaths = ( 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | shellPath = /bin/sh; 381 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example-resources.sh\"\n"; 382 | showEnvVarsInLog = 0; 383 | }; 384 | 83D1C3B9FAAFB290A8EBCC7E /* [CP] Embed Pods Frameworks */ = { 385 | isa = PBXShellScriptBuildPhase; 386 | buildActionMask = 2147483647; 387 | files = ( 388 | ); 389 | inputPaths = ( 390 | ); 391 | name = "[CP] Embed Pods Frameworks"; 392 | outputPaths = ( 393 | ); 394 | runOnlyForDeploymentPostprocessing = 0; 395 | shellPath = /bin/sh; 396 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests-frameworks.sh\"\n"; 397 | showEnvVarsInLog = 0; 398 | }; 399 | 926CCC2856F88693C91E24FF /* [CP] Check Pods Manifest.lock */ = { 400 | isa = PBXShellScriptBuildPhase; 401 | buildActionMask = 2147483647; 402 | files = ( 403 | ); 404 | inputPaths = ( 405 | ); 406 | name = "[CP] Check Pods Manifest.lock"; 407 | outputPaths = ( 408 | ); 409 | runOnlyForDeploymentPostprocessing = 0; 410 | shellPath = /bin/sh; 411 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; 412 | showEnvVarsInLog = 0; 413 | }; 414 | /* End PBXShellScriptBuildPhase section */ 415 | 416 | /* Begin PBXSourcesBuildPhase section */ 417 | 6003F586195388D20070C39A /* Sources */ = { 418 | isa = PBXSourcesBuildPhase; 419 | buildActionMask = 2147483647; 420 | files = ( 421 | 6B164B2F1D99A2C20021FAB6 /* AGViewControllerSwift.swift in Sources */, 422 | 6003F59E195388D20070C39A /* AGAppDelegate.m in Sources */, 423 | 6003F5A7195388D20070C39A /* AGViewController.m in Sources */, 424 | 6003F59A195388D20070C39A /* main.m in Sources */, 425 | ); 426 | runOnlyForDeploymentPostprocessing = 0; 427 | }; 428 | 6003F5AA195388D20070C39A /* Sources */ = { 429 | isa = PBXSourcesBuildPhase; 430 | buildActionMask = 2147483647; 431 | files = ( 432 | 6003F5BC195388D20070C39A /* Tests.m in Sources */, 433 | ); 434 | runOnlyForDeploymentPostprocessing = 0; 435 | }; 436 | /* End PBXSourcesBuildPhase section */ 437 | 438 | /* Begin PBXTargetDependency section */ 439 | 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { 440 | isa = PBXTargetDependency; 441 | target = 6003F589195388D20070C39A /* AGPullView_Example */; 442 | targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; 443 | }; 444 | /* End PBXTargetDependency section */ 445 | 446 | /* Begin PBXVariantGroup section */ 447 | 6003F596195388D20070C39A /* InfoPlist.strings */ = { 448 | isa = PBXVariantGroup; 449 | children = ( 450 | 6003F597195388D20070C39A /* en */, 451 | ); 452 | name = InfoPlist.strings; 453 | sourceTree = ""; 454 | }; 455 | 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { 456 | isa = PBXVariantGroup; 457 | children = ( 458 | 6003F5B9195388D20070C39A /* en */, 459 | ); 460 | name = InfoPlist.strings; 461 | sourceTree = ""; 462 | }; 463 | /* End PBXVariantGroup section */ 464 | 465 | /* Begin XCBuildConfiguration section */ 466 | 6003F5BD195388D20070C39A /* Debug */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | ALWAYS_SEARCH_USER_PATHS = NO; 470 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 471 | CLANG_CXX_LIBRARY = "libc++"; 472 | CLANG_ENABLE_MODULES = YES; 473 | CLANG_ENABLE_OBJC_ARC = YES; 474 | CLANG_WARN_BOOL_CONVERSION = YES; 475 | CLANG_WARN_CONSTANT_CONVERSION = YES; 476 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 477 | CLANG_WARN_EMPTY_BODY = YES; 478 | CLANG_WARN_ENUM_CONVERSION = YES; 479 | CLANG_WARN_INFINITE_RECURSION = YES; 480 | CLANG_WARN_INT_CONVERSION = YES; 481 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 482 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 483 | CLANG_WARN_UNREACHABLE_CODE = YES; 484 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 485 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 486 | COPY_PHASE_STRIP = NO; 487 | ENABLE_STRICT_OBJC_MSGSEND = YES; 488 | ENABLE_TESTABILITY = YES; 489 | GCC_C_LANGUAGE_STANDARD = gnu99; 490 | GCC_DYNAMIC_NO_PIC = NO; 491 | GCC_NO_COMMON_BLOCKS = YES; 492 | GCC_OPTIMIZATION_LEVEL = 0; 493 | GCC_PREPROCESSOR_DEFINITIONS = ( 494 | "DEBUG=1", 495 | "$(inherited)", 496 | ); 497 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 498 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 499 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 500 | GCC_WARN_UNDECLARED_SELECTOR = YES; 501 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 502 | GCC_WARN_UNUSED_FUNCTION = YES; 503 | GCC_WARN_UNUSED_VARIABLE = YES; 504 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 505 | ONLY_ACTIVE_ARCH = YES; 506 | SDKROOT = iphoneos; 507 | SWIFT_OBJC_BRIDGING_HEADER = ""; 508 | TARGETED_DEVICE_FAMILY = "1,2"; 509 | }; 510 | name = Debug; 511 | }; 512 | 6003F5BE195388D20070C39A /* Release */ = { 513 | isa = XCBuildConfiguration; 514 | buildSettings = { 515 | ALWAYS_SEARCH_USER_PATHS = NO; 516 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 517 | CLANG_CXX_LIBRARY = "libc++"; 518 | CLANG_ENABLE_MODULES = YES; 519 | CLANG_ENABLE_OBJC_ARC = YES; 520 | CLANG_WARN_BOOL_CONVERSION = YES; 521 | CLANG_WARN_CONSTANT_CONVERSION = YES; 522 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 523 | CLANG_WARN_EMPTY_BODY = YES; 524 | CLANG_WARN_ENUM_CONVERSION = YES; 525 | CLANG_WARN_INFINITE_RECURSION = YES; 526 | CLANG_WARN_INT_CONVERSION = YES; 527 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 528 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 529 | CLANG_WARN_UNREACHABLE_CODE = YES; 530 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 531 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 532 | COPY_PHASE_STRIP = YES; 533 | ENABLE_NS_ASSERTIONS = NO; 534 | ENABLE_STRICT_OBJC_MSGSEND = YES; 535 | GCC_C_LANGUAGE_STANDARD = gnu99; 536 | GCC_NO_COMMON_BLOCKS = YES; 537 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 538 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 539 | GCC_WARN_UNDECLARED_SELECTOR = YES; 540 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 541 | GCC_WARN_UNUSED_FUNCTION = YES; 542 | GCC_WARN_UNUSED_VARIABLE = YES; 543 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 544 | SDKROOT = iphoneos; 545 | SWIFT_OBJC_BRIDGING_HEADER = ""; 546 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 547 | TARGETED_DEVICE_FAMILY = "1,2"; 548 | VALIDATE_PRODUCT = YES; 549 | }; 550 | name = Release; 551 | }; 552 | 6003F5C0195388D20070C39A /* Debug */ = { 553 | isa = XCBuildConfiguration; 554 | baseConfigurationReference = E3C23D59ADDD1762EC25679D /* Pods-AGPullView_Example.debug.xcconfig */; 555 | buildSettings = { 556 | CLANG_ENABLE_MODULES = YES; 557 | FRAMEWORK_SEARCH_PATHS = ( 558 | "$(inherited)/**", 559 | "\"$PODS_CONFIGURATION_BUILD_DIR/AGPullView\"/**", 560 | ); 561 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 562 | GCC_PREFIX_HEADER = "AGPullView/AGPullView-Prefix.pch"; 563 | INFOPLIST_FILE = "AGPullView/AGPullView-Info.plist"; 564 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 565 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 566 | MODULE_NAME = ExampleApp; 567 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 568 | PRODUCT_NAME = "$(TARGET_NAME)"; 569 | SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/AGPullView Swift/AGPullView_Example-Bridging-Header.h"; 570 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 571 | SWIFT_VERSION = 3.0; 572 | USER_HEADER_SEARCH_PATHS = "${PROJECT_DIR}/Pods/**"; 573 | WRAPPER_EXTENSION = app; 574 | }; 575 | name = Debug; 576 | }; 577 | 6003F5C1195388D20070C39A /* Release */ = { 578 | isa = XCBuildConfiguration; 579 | baseConfigurationReference = 389CFE9FDB2DFF080274D7A9 /* Pods-AGPullView_Example.release.xcconfig */; 580 | buildSettings = { 581 | CLANG_ENABLE_MODULES = YES; 582 | FRAMEWORK_SEARCH_PATHS = ( 583 | "$(inherited)/**", 584 | "\"$PODS_CONFIGURATION_BUILD_DIR/AGPullView\"/**", 585 | ); 586 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 587 | GCC_PREFIX_HEADER = "AGPullView/AGPullView-Prefix.pch"; 588 | INFOPLIST_FILE = "AGPullView/AGPullView-Info.plist"; 589 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 590 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 591 | MODULE_NAME = ExampleApp; 592 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 593 | PRODUCT_NAME = "$(TARGET_NAME)"; 594 | SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/AGPullView Swift/AGPullView_Example-Bridging-Header.h"; 595 | SWIFT_VERSION = 3.0; 596 | USER_HEADER_SEARCH_PATHS = "${PROJECT_DIR}/Pods/**"; 597 | WRAPPER_EXTENSION = app; 598 | }; 599 | name = Release; 600 | }; 601 | 6003F5C3195388D20070C39A /* Debug */ = { 602 | isa = XCBuildConfiguration; 603 | baseConfigurationReference = C85C2F816BA7344A8DBCB6EE /* Pods-AGPullView_Tests.debug.xcconfig */; 604 | buildSettings = { 605 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 606 | BUNDLE_LOADER = "$(TEST_HOST)"; 607 | FRAMEWORK_SEARCH_PATHS = ( 608 | "$(SDKROOT)/Developer/Library/Frameworks", 609 | "$(inherited)", 610 | "$(DEVELOPER_FRAMEWORKS_DIR)", 611 | ); 612 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 613 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 614 | GCC_PREPROCESSOR_DEFINITIONS = ( 615 | "DEBUG=1", 616 | "$(inherited)", 617 | ); 618 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 619 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 620 | PRODUCT_NAME = "$(TARGET_NAME)"; 621 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AGPullView_Example.app/AGPullView_Example"; 622 | WRAPPER_EXTENSION = xctest; 623 | }; 624 | name = Debug; 625 | }; 626 | 6003F5C4195388D20070C39A /* Release */ = { 627 | isa = XCBuildConfiguration; 628 | baseConfigurationReference = 7CB81E15FA4B2F7014F0406E /* Pods-AGPullView_Tests.release.xcconfig */; 629 | buildSettings = { 630 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 631 | BUNDLE_LOADER = "$(TEST_HOST)"; 632 | FRAMEWORK_SEARCH_PATHS = ( 633 | "$(SDKROOT)/Developer/Library/Frameworks", 634 | "$(inherited)", 635 | "$(DEVELOPER_FRAMEWORKS_DIR)", 636 | ); 637 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 638 | GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; 639 | INFOPLIST_FILE = "Tests/Tests-Info.plist"; 640 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; 641 | PRODUCT_NAME = "$(TARGET_NAME)"; 642 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AGPullView_Example.app/AGPullView_Example"; 643 | WRAPPER_EXTENSION = xctest; 644 | }; 645 | name = Release; 646 | }; 647 | /* End XCBuildConfiguration section */ 648 | 649 | /* Begin XCConfigurationList section */ 650 | 6003F585195388D10070C39A /* Build configuration list for PBXProject "AGPullView" */ = { 651 | isa = XCConfigurationList; 652 | buildConfigurations = ( 653 | 6003F5BD195388D20070C39A /* Debug */, 654 | 6003F5BE195388D20070C39A /* Release */, 655 | ); 656 | defaultConfigurationIsVisible = 0; 657 | defaultConfigurationName = Release; 658 | }; 659 | 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "AGPullView_Example" */ = { 660 | isa = XCConfigurationList; 661 | buildConfigurations = ( 662 | 6003F5C0195388D20070C39A /* Debug */, 663 | 6003F5C1195388D20070C39A /* Release */, 664 | ); 665 | defaultConfigurationIsVisible = 0; 666 | defaultConfigurationName = Release; 667 | }; 668 | 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "AGPullView_Tests" */ = { 669 | isa = XCConfigurationList; 670 | buildConfigurations = ( 671 | 6003F5C3195388D20070C39A /* Debug */, 672 | 6003F5C4195388D20070C39A /* Release */, 673 | ); 674 | defaultConfigurationIsVisible = 0; 675 | defaultConfigurationName = Release; 676 | }; 677 | /* End XCConfigurationList section */ 678 | }; 679 | rootObject = 6003F582195388D10070C39A /* Project object */; 680 | } 681 | -------------------------------------------------------------------------------- /Example/AGPullView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/AGPullView.xcodeproj/xcshareddata/xcschemes/AGPullView-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Example/AGPullView.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/AGPullView/AGAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AGAppDelegate.h 3 | // AGPullView 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface AGAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/AGPullView/AGAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AGAppDelegate.m 3 | // AGPullView 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGAppDelegate.h" 10 | #import "AGViewController.h" 11 | 12 | @implementation AGAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 17 | [self.window makeKeyAndVisible]; 18 | self.window.rootViewController = [[AGViewController alloc] init]; 19 | return YES; 20 | } 21 | 22 | - (void)applicationWillResignActive:(UIApplication *)application 23 | { 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 | { 30 | // 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. 31 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 32 | } 33 | 34 | - (void)applicationWillEnterForeground:(UIApplication *)application 35 | { 36 | // 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. 37 | } 38 | 39 | - (void)applicationDidBecomeActive:(UIApplication *)application 40 | { 41 | // 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. 42 | } 43 | 44 | - (void)applicationWillTerminate:(UIApplication *)application 45 | { 46 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Example/AGPullView/AGPullView-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 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.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | AGViewController 29 | UIMainStoryboardFile 30 | 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Example/AGPullView/AGPullView-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | @import UIKit; 15 | @import Foundation; 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/AGPullView/AGViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AGViewController.h 3 | // AGPullView 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface AGViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/AGPullView/AGViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AGViewController.m 3 | // AGPullView 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | #import "AGViewController.h" 10 | #import "AGPullViewconfigurator.h" 11 | 12 | @interface AGViewController () 13 | 14 | @property (nonatomic, strong) AGPullViewConfigurator *configurator; 15 | 16 | @end 17 | 18 | @implementation AGViewController 19 | 20 | - (void)viewDidLoad 21 | { 22 | [super viewDidLoad]; 23 | 24 | //AGPullView configuration 25 | self.configurator = [AGPullViewConfigurator new]; 26 | [self.configurator setupPullViewForSuperview:self.view colorScheme:ColorSchemeTypeGrayTransparent]; 27 | self.configurator.percentOfFilling = @100; 28 | self.configurator.delegate = self; 29 | self.configurator.needBounceEffect = true; 30 | self.configurator.animationDuration = @0.3; 31 | self.configurator.enableShowingWithTouch = true; 32 | self.configurator.enableHidingWithTouch = false; 33 | [self.configurator enableBlurEffectWithBlurStyle:UIBlurEffectStyleLight]; 34 | 35 | //Test UITableView 36 | UITableView *table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 300, 300) style:UITableViewStyleGrouped]; 37 | table.dataSource = self; 38 | table.separatorStyle = UITableViewCellSeparatorStyleNone; 39 | table.backgroundColor = [UIColor clearColor]; 40 | 41 | //Filling whole AGPullView with test UITableView 42 | [self.configurator fullfillContentViewWithView:table]; 43 | } 44 | 45 | //For correct working of layout in early versions of iOS 10 46 | - (void)viewDidLayoutSubviews { 47 | [super viewDidLayoutSubviews]; 48 | [self.configurator layoutPullView]; 49 | } 50 | 51 | - (void)viewDidAppear:(BOOL)animated { 52 | [super viewDidAppear:animated]; 53 | 54 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 55 | [self.configurator showAnimated:YES forPercent:30]; 56 | }); 57 | 58 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 59 | [self.configurator showAnimated:YES forPercent:50]; 60 | }); 61 | 62 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 63 | [self.configurator showAnimated:YES forPercent:100]; 64 | }); 65 | } 66 | 67 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 68 | return 5; 69 | } 70 | 71 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 72 | UITableViewCell *cell = [[UITableViewCell alloc] init]; 73 | cell.backgroundColor = [UIColor clearColor]; 74 | cell.textLabel.textColor = [UIColor redColor]; 75 | cell.textLabel.text = @"Test"; 76 | 77 | return cell; 78 | } 79 | 80 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 81 | [self.configurator handleTouchesBegan:touches]; 82 | } 83 | 84 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 85 | [self.configurator handleTouchesMoved:touches]; 86 | } 87 | 88 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 89 | [self.configurator handleTouchesEnded:touches]; 90 | } 91 | 92 | - (void)didDragPullView:(AGPullView *)pullView withOpeningPercent:(float)openingPercent { 93 | NSLog(@"%f", openingPercent); 94 | } 95 | 96 | - (void)didShowPullView:(AGPullView *)pullView { 97 | NSLog(@"shown"); 98 | } 99 | 100 | - (void)didHidePullView:(AGPullView *)pullView { 101 | NSLog(@"hidden"); 102 | } 103 | 104 | - (void)didTouchToShowPullView:(AGPullView *)pullView { 105 | NSLog(@"touched to show"); 106 | } 107 | 108 | - (void)didTouchToHidePullView:(AGPullView *)pullView { 109 | NSLog(@"touched to hide"); 110 | } 111 | 112 | - (IBAction)openSwiftController:(id)sender { 113 | UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"SwiftExample" bundle:[NSBundle mainBundle]]; 114 | UIViewController *swiftVC = [storyBoard instantiateViewControllerWithIdentifier:@"exampleSwiftVC"]; 115 | [self presentViewController:swiftVC animated:YES completion:nil]; 116 | } 117 | 118 | - (IBAction)changeAppearenceToRandom:(id)sender { 119 | NSInteger randomBlur = arc4random_uniform(2); 120 | self.configurator.blurStyle = randomBlur; 121 | 122 | NSInteger randomColorScheme = arc4random_uniform(6); 123 | self.configurator.colorSchemeType = randomColorScheme; 124 | } 125 | 126 | @end 127 | -------------------------------------------------------------------------------- /Example/AGPullView/AGViewController.xib: -------------------------------------------------------------------------------- 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 | 34 | 44 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /Example/AGPullView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "ipad", 20 | "size" : "29x29", 21 | "scale" : "1x" 22 | }, 23 | { 24 | "idiom" : "ipad", 25 | "size" : "29x29", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "ipad", 30 | "size" : "40x40", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "40x40", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "76x76", 41 | "scale" : "1x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "76x76", 46 | "scale" : "2x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Example/AGPullView/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "orientation" : "portrait", 20 | "idiom" : "ipad", 21 | "extent" : "full-screen", 22 | "minimum-system-version" : "7.0", 23 | "scale" : "1x" 24 | }, 25 | { 26 | "orientation" : "landscape", 27 | "idiom" : "ipad", 28 | "extent" : "full-screen", 29 | "minimum-system-version" : "7.0", 30 | "scale" : "1x" 31 | }, 32 | { 33 | "orientation" : "portrait", 34 | "idiom" : "ipad", 35 | "extent" : "full-screen", 36 | "minimum-system-version" : "7.0", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "orientation" : "landscape", 41 | "idiom" : "ipad", 42 | "extent" : "full-screen", 43 | "minimum-system-version" : "7.0", 44 | "scale" : "2x" 45 | } 46 | ], 47 | "info" : { 48 | "version" : 1, 49 | "author" : "xcode" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Example/AGPullView/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/AGPullView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // AGPullView 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "AGAppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) 13 | { 14 | @autoreleasepool { 15 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AGAppDelegate class])); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'AGPullView_Example' do 4 | pod 'AGPullView', :path => '../' 5 | end 6 | 7 | target 'AGPullView_Tests' do 8 | pod 'AGPullView', :path => '../' 9 | end 10 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AGPullView (0.5.0) 3 | 4 | DEPENDENCIES: 5 | - AGPullView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | AGPullView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | AGPullView: f72406c05fb078abae509a5578635f5286fbf738 13 | 14 | PODFILE CHECKSUM: ea7c694f4e66d565b95c16ce60d1155c416465cb 15 | 16 | COCOAPODS: 1.2.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AGPullView (0.5.0) 3 | 4 | DEPENDENCIES: 5 | - AGPullView (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | AGPullView: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | AGPullView: f72406c05fb078abae509a5578635f5286fbf738 13 | 14 | PODFILE CHECKSUM: ea7c694f4e66d565b95c16ce60d1155c416465cb 15 | 16 | COCOAPODS: 1.2.1 17 | -------------------------------------------------------------------------------- /Example/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 | 15AAAC4E9526B0B0A64C330EBCD8A0D7 /* AGPullView-iOS8.3-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 10E14230C5C5260D74C8B7564D64E14B /* AGPullView-iOS8.3-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 1EA560B9C8FF9C8BE235DBBB87CA2B82 /* AGListViewAnimationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = AE95F451F206380B89DE91258EF888A3 /* AGListViewAnimationButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 35CA3D05BC6975806D641231605664C5 /* Pods-AGPullView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AB8B3745F9748F050CAA9386C40BAB22 /* Pods-AGPullView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 3A149F023B3FD497A9CD61E19A73CAD3 /* AGPullMarginView.m in Sources */ = {isa = PBXBuildFile; fileRef = D26FC0EA3EF7A9EFB45519793726C109 /* AGPullMarginView.m */; }; 14 | 41661484E30E61071017816DFF09BC7E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 15 | 465A6E3555EC6D0B9D16E24AF57FF6B8 /* AGPullMarginView.m in Sources */ = {isa = PBXBuildFile; fileRef = D26FC0EA3EF7A9EFB45519793726C109 /* AGPullMarginView.m */; }; 16 | 4C2D6D85A5BD2186AD430B64F08A0B3A /* AGPullViewConfigurator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A09CC1B06CD95D8C2D273847AA8266A /* AGPullViewConfigurator.m */; }; 17 | 4D6B7B091FAD1EF249DC738B6000EECB /* AGPullViewConfigurator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B101111482CDEB32F1D5D7AE423E6DB /* AGPullViewConfigurator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 18 | 4E45729F93EE7C85B371EE402CDC8B7A /* AGPullView-iOS8.0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D90A64CF362152B3B9187BAB5010FBB /* AGPullView-iOS8.0-dummy.m */; }; 19 | 5A7632B8BD4B2613691E9718450D508E /* AGListViewAnimationButton.h in Headers */ = {isa = PBXBuildFile; fileRef = AE95F451F206380B89DE91258EF888A3 /* AGListViewAnimationButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 609CE74942E7BC4DC9D8BC31C19F343D /* AGSettingsEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 7650ED8D50B18C1B38B692BAE0FA7915 /* AGSettingsEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | 642BB0B98DA6289DC287901D88E168B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 22 | 70926EBBD751EEBB7438DA2BE6298C7C /* AGPullMarginView.h in Headers */ = {isa = PBXBuildFile; fileRef = 871F1F619E869E89CA22B38E5FD5C7C0 /* AGPullMarginView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | 720CF75948AB6934C0CDD74486B0C5B5 /* AGPullView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F425372362BAF52DE7B0F14ACAEE952 /* AGPullView.m */; }; 24 | 74D20FAE49C9EDFD0F26DE45C7B0069E /* AGPullView.h in Headers */ = {isa = PBXBuildFile; fileRef = A592E17886BB4CDF8D5BA3C88D653E99 /* AGPullView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | 7B5ABC2C89DE2DD1A74D3CF526A7D902 /* Pods-AGPullView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ABFCEEDA9E613117F01F0665AEB104C7 /* Pods-AGPullView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 26 | 914A2D406FD9CBEAF79515615BAB0BD6 /* Pods-AGPullView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3DB8A7050EDE6B38FED3B2B339464B9 /* Pods-AGPullView_Example-dummy.m */; }; 27 | 9167DE9B82C327181483D8841A1DC714 /* AGConfiguratorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9893A5ABC82B64CB61D8DF8EB87C62DB /* AGConfiguratorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | 9CC5D7A6BFB67E596021268540ED1C67 /* AGPullViewConfigurator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B101111482CDEB32F1D5D7AE423E6DB /* AGPullViewConfigurator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29 | B4D939D1A188CB447117DC890C33B300 /* AGListViewAnimationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1529B7E44BAF6476F1FD47FF442FCB55 /* AGListViewAnimationButton.m */; }; 30 | B7D6C98F368D7167FD5D94D61F1EA7DF /* AGPullView-iOS8.3-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCF442DA98B589DF77C99D91799CCBA4 /* AGPullView-iOS8.3-dummy.m */; }; 31 | C598389C32C97A37993BA8D71E8A46FE /* AGSettingsEnums.h in Headers */ = {isa = PBXBuildFile; fileRef = 7650ED8D50B18C1B38B692BAE0FA7915 /* AGSettingsEnums.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32 | D00B12A8D343327CDC8D88D838A7558F /* AGPullMarginView.h in Headers */ = {isa = PBXBuildFile; fileRef = 871F1F619E869E89CA22B38E5FD5C7C0 /* AGPullMarginView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 33 | D1F739D1DF0E5F40AF19FBE16AE7199A /* AGPullView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F425372362BAF52DE7B0F14ACAEE952 /* AGPullView.m */; }; 34 | D565AA5C0420F703991C3429AD3644DA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 35 | E473339C5EA26C8E7B018D78824C2034 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */; }; 36 | EF15FA64190E548A0EC63E1656659F90 /* AGPullView.h in Headers */ = {isa = PBXBuildFile; fileRef = A592E17886BB4CDF8D5BA3C88D653E99 /* AGPullView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 37 | EFC210C1389FEEFB6C38ACA6B41F2257 /* AGListViewAnimationButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1529B7E44BAF6476F1FD47FF442FCB55 /* AGListViewAnimationButton.m */; }; 38 | F1A3AE4B26A504CA2922FDABDB1AB732 /* Pods-AGPullView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3F0362AF2BDDE3CFEF687FF4394A9D6 /* Pods-AGPullView_Tests-dummy.m */; }; 39 | F911F8D3A9958F4FD91344DED9F83BEE /* AGConfiguratorDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9893A5ABC82B64CB61D8DF8EB87C62DB /* AGConfiguratorDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 40 | F9CF824AB3E8B46FE207832CBFCFEBC9 /* AGPullViewConfigurator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A09CC1B06CD95D8C2D273847AA8266A /* AGPullViewConfigurator.m */; }; 41 | F9F608751E8A304B3D8BA819F3D6FEED /* AGPullView-iOS8.0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EB793B8C89B2E9A81ED94A5B0E8390A /* AGPullView-iOS8.0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42 | /* End PBXBuildFile section */ 43 | 44 | /* Begin PBXContainerItemProxy section */ 45 | 57F9EBA052BB3BD428766E19F1C69542 /* PBXContainerItemProxy */ = { 46 | isa = PBXContainerItemProxy; 47 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 48 | proxyType = 1; 49 | remoteGlobalIDString = 352B7AE7FEF0516FD555363638D056D9; 50 | remoteInfo = "AGPullView-iOS8.0"; 51 | }; 52 | F3DF6A9C02E235DCE794CB5943B1B99F /* PBXContainerItemProxy */ = { 53 | isa = PBXContainerItemProxy; 54 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 55 | proxyType = 1; 56 | remoteGlobalIDString = 770D3D9DA9F4D9DD719291B6ABDD0B36; 57 | remoteInfo = "AGPullView-iOS8.3"; 58 | }; 59 | /* End PBXContainerItemProxy section */ 60 | 61 | /* Begin PBXFileReference section */ 62 | 0EE87D5006BCF2FB6E92123C723BE416 /* AGPullView-iOS8.3.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "AGPullView-iOS8.3.xcconfig"; path = "../AGPullView-iOS8.3/AGPullView-iOS8.3.xcconfig"; sourceTree = ""; }; 63 | 10E14230C5C5260D74C8B7564D64E14B /* AGPullView-iOS8.3-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "AGPullView-iOS8.3-umbrella.h"; path = "../AGPullView-iOS8.3/AGPullView-iOS8.3-umbrella.h"; sourceTree = ""; }; 64 | 14DE283065BEB1A25BCE8A5B815D5FF7 /* Pods-AGPullView_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AGPullView_Tests-resources.sh"; sourceTree = ""; }; 65 | 1529B7E44BAF6476F1FD47FF442FCB55 /* AGListViewAnimationButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = AGListViewAnimationButton.m; sourceTree = ""; }; 66 | 1FD2100EB5A01CA20256A2AF04E48DFA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../AGPullView-iOS8.3/Info.plist"; sourceTree = ""; }; 67 | 226757AE1DCB46AE092B1F279A68DDA4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 68 | 2949134B8123D8C290841E58EC774CBA /* Pods-AGPullView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AGPullView_Tests.release.xcconfig"; sourceTree = ""; }; 69 | 2B101111482CDEB32F1D5D7AE423E6DB /* AGPullViewConfigurator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGPullViewConfigurator.h; sourceTree = ""; }; 70 | 2BFC71A6E2C7DB9766F1FEA4F699F45D /* AGPullView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AGPullView.framework; path = "AGPullView-iOS8.0.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 2F425372362BAF52DE7B0F14ACAEE952 /* AGPullView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = AGPullView.m; sourceTree = ""; }; 72 | 3EE96C571EC8184E09CB1B228662A7B4 /* AGPullView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AGPullView.framework; path = "AGPullView-iOS8.3.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 40D24C81B84A79C3C4F14B43146C5706 /* Pods-AGPullView_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AGPullView_Tests-acknowledgements.plist"; sourceTree = ""; }; 74 | 427B63D9A0CBD8785746ADAAFDC20F8C /* Pods-AGPullView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-AGPullView_Example.modulemap"; sourceTree = ""; }; 75 | 4963DDE1A4F0F4CFE362A9C87E2F286A /* Pods-AGPullView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AGPullView_Example-acknowledgements.plist"; sourceTree = ""; }; 76 | 4EB793B8C89B2E9A81ED94A5B0E8390A /* AGPullView-iOS8.0-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AGPullView-iOS8.0-umbrella.h"; sourceTree = ""; }; 77 | 5844253F2E3FC7302D40A34920083B9E /* AGPullView-iOS8.0.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "AGPullView-iOS8.0.modulemap"; sourceTree = ""; }; 78 | 5CA98898E6CC95C3F8856CAD425DAC6C /* Pods-AGPullView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AGPullView_Example-frameworks.sh"; sourceTree = ""; }; 79 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 80 | 7650ED8D50B18C1B38B692BAE0FA7915 /* AGSettingsEnums.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGSettingsEnums.h; sourceTree = ""; }; 81 | 7DD7ECAE4FECD7993465F114DE226EC3 /* Pods-AGPullView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AGPullView_Tests.debug.xcconfig"; sourceTree = ""; }; 82 | 871F1F619E869E89CA22B38E5FD5C7C0 /* AGPullMarginView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGPullMarginView.h; sourceTree = ""; }; 83 | 8A09CC1B06CD95D8C2D273847AA8266A /* AGPullViewConfigurator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = AGPullViewConfigurator.m; sourceTree = ""; }; 84 | 8D90A64CF362152B3B9187BAB5010FBB /* AGPullView-iOS8.0-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AGPullView-iOS8.0-dummy.m"; sourceTree = ""; }; 85 | 8F9E2B7FDAD4B3CBB822C427E38C19C7 /* Pods_AGPullView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AGPullView_Tests.framework; path = "Pods-AGPullView_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 87 | 93EDC2B3B50597CA823882E01D59338E /* Pods-AGPullView_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-AGPullView_Tests.modulemap"; sourceTree = ""; }; 88 | 9593DBB803045B6A99F88F303D48609C /* Pods-AGPullView_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AGPullView_Example-resources.sh"; sourceTree = ""; }; 89 | 969814ACCA60131B1B8FDD0BEE7AE94F /* Pods_AGPullView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AGPullView_Example.framework; path = "Pods-AGPullView_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 90 | 9893A5ABC82B64CB61D8DF8EB87C62DB /* AGConfiguratorDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGConfiguratorDelegate.h; sourceTree = ""; }; 91 | A16867FB438D04B9BE58B5F37D08CA8D /* AGPullView-iOS8.0-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AGPullView-iOS8.0-prefix.pch"; sourceTree = ""; }; 92 | A592E17886BB4CDF8D5BA3C88D653E99 /* AGPullView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGPullView.h; sourceTree = ""; }; 93 | A70805736E8067AA67738287670197BF /* Pods-AGPullView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AGPullView_Example.debug.xcconfig"; sourceTree = ""; }; 94 | AB8B3745F9748F050CAA9386C40BAB22 /* Pods-AGPullView_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AGPullView_Tests-umbrella.h"; sourceTree = ""; }; 95 | ABFCEEDA9E613117F01F0665AEB104C7 /* Pods-AGPullView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AGPullView_Example-umbrella.h"; sourceTree = ""; }; 96 | ACFE75868726C50B9C9E540A600874E3 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 97 | AE95F451F206380B89DE91258EF888A3 /* AGListViewAnimationButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = AGListViewAnimationButton.h; sourceTree = ""; }; 98 | C4CF5D92E1C8E67877E6C64C10B17CAF /* Pods-AGPullView_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AGPullView_Tests-frameworks.sh"; sourceTree = ""; }; 99 | D26FC0EA3EF7A9EFB45519793726C109 /* AGPullMarginView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = AGPullMarginView.m; sourceTree = ""; }; 100 | D82D4CF9FD1E083FF231971F1F7A2FA0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 101 | E3DB8A7050EDE6B38FED3B2B339464B9 /* Pods-AGPullView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AGPullView_Example-dummy.m"; sourceTree = ""; }; 102 | E3F0362AF2BDDE3CFEF687FF4394A9D6 /* Pods-AGPullView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AGPullView_Tests-dummy.m"; sourceTree = ""; }; 103 | E8675E125DFD973812BA9000EA4F48CB /* Pods-AGPullView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AGPullView_Example.release.xcconfig"; sourceTree = ""; }; 104 | EB8E715D033F31FEFED5389E8903BFAF /* Pods-AGPullView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AGPullView_Example-acknowledgements.markdown"; sourceTree = ""; }; 105 | F5EC9BFDF35538FAB820765AE2F2DDA4 /* AGPullView-iOS8.3.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; name = "AGPullView-iOS8.3.modulemap"; path = "../AGPullView-iOS8.3/AGPullView-iOS8.3.modulemap"; sourceTree = ""; }; 106 | FAF93DE4E5052F57FDB495A23668B211 /* AGPullView-iOS8.0.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AGPullView-iOS8.0.xcconfig"; sourceTree = ""; }; 107 | FC49DC78FD52759B111E0A91DA54FAB0 /* Pods-AGPullView_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AGPullView_Tests-acknowledgements.markdown"; sourceTree = ""; }; 108 | FCF442DA98B589DF77C99D91799CCBA4 /* AGPullView-iOS8.3-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "AGPullView-iOS8.3-dummy.m"; path = "../AGPullView-iOS8.3/AGPullView-iOS8.3-dummy.m"; sourceTree = ""; }; 109 | FEC4A71552004B4AB97547C1BE04FE62 /* AGPullView-iOS8.3-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "AGPullView-iOS8.3-prefix.pch"; path = "../AGPullView-iOS8.3/AGPullView-iOS8.3-prefix.pch"; sourceTree = ""; }; 110 | /* End PBXFileReference section */ 111 | 112 | /* Begin PBXFrameworksBuildPhase section */ 113 | 389165C3D7F62C92C35C1326F131FF80 /* Frameworks */ = { 114 | isa = PBXFrameworksBuildPhase; 115 | buildActionMask = 2147483647; 116 | files = ( 117 | D565AA5C0420F703991C3429AD3644DA /* Foundation.framework in Frameworks */, 118 | ); 119 | runOnlyForDeploymentPostprocessing = 0; 120 | }; 121 | 67FB8F3733E33AAC4F1AB9A072F1528D /* Frameworks */ = { 122 | isa = PBXFrameworksBuildPhase; 123 | buildActionMask = 2147483647; 124 | files = ( 125 | E473339C5EA26C8E7B018D78824C2034 /* Foundation.framework in Frameworks */, 126 | ); 127 | runOnlyForDeploymentPostprocessing = 0; 128 | }; 129 | 7D9E2AF6E75E64CD0E88C00D14015BB1 /* Frameworks */ = { 130 | isa = PBXFrameworksBuildPhase; 131 | buildActionMask = 2147483647; 132 | files = ( 133 | 642BB0B98DA6289DC287901D88E168B1 /* Foundation.framework in Frameworks */, 134 | ); 135 | runOnlyForDeploymentPostprocessing = 0; 136 | }; 137 | E9A9BC033AE42C200933114B26613659 /* Frameworks */ = { 138 | isa = PBXFrameworksBuildPhase; 139 | buildActionMask = 2147483647; 140 | files = ( 141 | 41661484E30E61071017816DFF09BC7E /* Foundation.framework in Frameworks */, 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | /* End PBXFrameworksBuildPhase section */ 146 | 147 | /* Begin PBXGroup section */ 148 | 1B00BA4E12FAB94B21FB438321939174 /* Targets Support Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 6F4E7A8F945231C93415E2DBD48E83CC /* Pods-AGPullView_Example */, 152 | 654F9945DC4A5A1CE80425AD322FB9F2 /* Pods-AGPullView_Tests */, 153 | ); 154 | name = "Targets Support Files"; 155 | sourceTree = ""; 156 | }; 157 | 654F9945DC4A5A1CE80425AD322FB9F2 /* Pods-AGPullView_Tests */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | D82D4CF9FD1E083FF231971F1F7A2FA0 /* Info.plist */, 161 | 93EDC2B3B50597CA823882E01D59338E /* Pods-AGPullView_Tests.modulemap */, 162 | FC49DC78FD52759B111E0A91DA54FAB0 /* Pods-AGPullView_Tests-acknowledgements.markdown */, 163 | 40D24C81B84A79C3C4F14B43146C5706 /* Pods-AGPullView_Tests-acknowledgements.plist */, 164 | E3F0362AF2BDDE3CFEF687FF4394A9D6 /* Pods-AGPullView_Tests-dummy.m */, 165 | C4CF5D92E1C8E67877E6C64C10B17CAF /* Pods-AGPullView_Tests-frameworks.sh */, 166 | 14DE283065BEB1A25BCE8A5B815D5FF7 /* Pods-AGPullView_Tests-resources.sh */, 167 | AB8B3745F9748F050CAA9386C40BAB22 /* Pods-AGPullView_Tests-umbrella.h */, 168 | 7DD7ECAE4FECD7993465F114DE226EC3 /* Pods-AGPullView_Tests.debug.xcconfig */, 169 | 2949134B8123D8C290841E58EC774CBA /* Pods-AGPullView_Tests.release.xcconfig */, 170 | ); 171 | name = "Pods-AGPullView_Tests"; 172 | path = "Target Support Files/Pods-AGPullView_Tests"; 173 | sourceTree = ""; 174 | }; 175 | 6F4E7A8F945231C93415E2DBD48E83CC /* Pods-AGPullView_Example */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | ACFE75868726C50B9C9E540A600874E3 /* Info.plist */, 179 | 427B63D9A0CBD8785746ADAAFDC20F8C /* Pods-AGPullView_Example.modulemap */, 180 | EB8E715D033F31FEFED5389E8903BFAF /* Pods-AGPullView_Example-acknowledgements.markdown */, 181 | 4963DDE1A4F0F4CFE362A9C87E2F286A /* Pods-AGPullView_Example-acknowledgements.plist */, 182 | E3DB8A7050EDE6B38FED3B2B339464B9 /* Pods-AGPullView_Example-dummy.m */, 183 | 5CA98898E6CC95C3F8856CAD425DAC6C /* Pods-AGPullView_Example-frameworks.sh */, 184 | 9593DBB803045B6A99F88F303D48609C /* Pods-AGPullView_Example-resources.sh */, 185 | ABFCEEDA9E613117F01F0665AEB104C7 /* Pods-AGPullView_Example-umbrella.h */, 186 | A70805736E8067AA67738287670197BF /* Pods-AGPullView_Example.debug.xcconfig */, 187 | E8675E125DFD973812BA9000EA4F48CB /* Pods-AGPullView_Example.release.xcconfig */, 188 | ); 189 | name = "Pods-AGPullView_Example"; 190 | path = "Target Support Files/Pods-AGPullView_Example"; 191 | sourceTree = ""; 192 | }; 193 | 760C8A02672E1EFC625D2B2E94C6DBAC /* Products */ = { 194 | isa = PBXGroup; 195 | children = ( 196 | 2BFC71A6E2C7DB9766F1FEA4F699F45D /* AGPullView.framework */, 197 | 3EE96C571EC8184E09CB1B228662A7B4 /* AGPullView.framework */, 198 | 969814ACCA60131B1B8FDD0BEE7AE94F /* Pods_AGPullView_Example.framework */, 199 | 8F9E2B7FDAD4B3CBB822C427E38C19C7 /* Pods_AGPullView_Tests.framework */, 200 | ); 201 | name = Products; 202 | sourceTree = ""; 203 | }; 204 | 773EDB169969A56365FE24C4F4E8A2C9 /* AGPullView */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | FF55543AAB80B76CB7F9C7FA20F43550 /* Classes */, 208 | ); 209 | name = AGPullView; 210 | path = AGPullView; 211 | sourceTree = ""; 212 | }; 213 | 7DB346D0F39D3F0E887471402A8071AB = { 214 | isa = PBXGroup; 215 | children = ( 216 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 217 | 85BDD2AE90E8D64AFC27105FB6EBC6F8 /* Development Pods */, 218 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 219 | 760C8A02672E1EFC625D2B2E94C6DBAC /* Products */, 220 | 1B00BA4E12FAB94B21FB438321939174 /* Targets Support Files */, 221 | ); 222 | sourceTree = ""; 223 | }; 224 | 85BDD2AE90E8D64AFC27105FB6EBC6F8 /* Development Pods */ = { 225 | isa = PBXGroup; 226 | children = ( 227 | D3C4C04E4B6DBCC2B04171D81DB189A6 /* AGPullView */, 228 | ); 229 | name = "Development Pods"; 230 | sourceTree = ""; 231 | }; 232 | ABDA1CA64937E9B13D4F8606742AE30D /* Support Files */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | 5844253F2E3FC7302D40A34920083B9E /* AGPullView-iOS8.0.modulemap */, 236 | FAF93DE4E5052F57FDB495A23668B211 /* AGPullView-iOS8.0.xcconfig */, 237 | 8D90A64CF362152B3B9187BAB5010FBB /* AGPullView-iOS8.0-dummy.m */, 238 | A16867FB438D04B9BE58B5F37D08CA8D /* AGPullView-iOS8.0-prefix.pch */, 239 | 4EB793B8C89B2E9A81ED94A5B0E8390A /* AGPullView-iOS8.0-umbrella.h */, 240 | F5EC9BFDF35538FAB820765AE2F2DDA4 /* AGPullView-iOS8.3.modulemap */, 241 | 0EE87D5006BCF2FB6E92123C723BE416 /* AGPullView-iOS8.3.xcconfig */, 242 | FCF442DA98B589DF77C99D91799CCBA4 /* AGPullView-iOS8.3-dummy.m */, 243 | FEC4A71552004B4AB97547C1BE04FE62 /* AGPullView-iOS8.3-prefix.pch */, 244 | 10E14230C5C5260D74C8B7564D64E14B /* AGPullView-iOS8.3-umbrella.h */, 245 | 1FD2100EB5A01CA20256A2AF04E48DFA /* Info.plist */, 246 | 226757AE1DCB46AE092B1F279A68DDA4 /* Info.plist */, 247 | ); 248 | name = "Support Files"; 249 | path = "Example/Pods/Target Support Files/AGPullView-iOS8.0"; 250 | sourceTree = ""; 251 | }; 252 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 253 | isa = PBXGroup; 254 | children = ( 255 | D35AF013A5F0BAD4F32504907A52519E /* iOS */, 256 | ); 257 | name = Frameworks; 258 | sourceTree = ""; 259 | }; 260 | D35AF013A5F0BAD4F32504907A52519E /* iOS */ = { 261 | isa = PBXGroup; 262 | children = ( 263 | 6604A7D69453B4569E4E4827FB9155A9 /* Foundation.framework */, 264 | ); 265 | name = iOS; 266 | sourceTree = ""; 267 | }; 268 | D3C4C04E4B6DBCC2B04171D81DB189A6 /* AGPullView */ = { 269 | isa = PBXGroup; 270 | children = ( 271 | 773EDB169969A56365FE24C4F4E8A2C9 /* AGPullView */, 272 | ABDA1CA64937E9B13D4F8606742AE30D /* Support Files */, 273 | ); 274 | name = AGPullView; 275 | path = ../..; 276 | sourceTree = ""; 277 | }; 278 | FF55543AAB80B76CB7F9C7FA20F43550 /* Classes */ = { 279 | isa = PBXGroup; 280 | children = ( 281 | 9893A5ABC82B64CB61D8DF8EB87C62DB /* AGConfiguratorDelegate.h */, 282 | AE95F451F206380B89DE91258EF888A3 /* AGListViewAnimationButton.h */, 283 | 1529B7E44BAF6476F1FD47FF442FCB55 /* AGListViewAnimationButton.m */, 284 | 871F1F619E869E89CA22B38E5FD5C7C0 /* AGPullMarginView.h */, 285 | D26FC0EA3EF7A9EFB45519793726C109 /* AGPullMarginView.m */, 286 | A592E17886BB4CDF8D5BA3C88D653E99 /* AGPullView.h */, 287 | 2F425372362BAF52DE7B0F14ACAEE952 /* AGPullView.m */, 288 | 2B101111482CDEB32F1D5D7AE423E6DB /* AGPullViewConfigurator.h */, 289 | 8A09CC1B06CD95D8C2D273847AA8266A /* AGPullViewConfigurator.m */, 290 | 7650ED8D50B18C1B38B692BAE0FA7915 /* AGSettingsEnums.h */, 291 | ); 292 | name = Classes; 293 | path = Classes; 294 | sourceTree = ""; 295 | }; 296 | /* End PBXGroup section */ 297 | 298 | /* Begin PBXHeadersBuildPhase section */ 299 | 014E834D608F17E93188F5EC0718FA80 /* Headers */ = { 300 | isa = PBXHeadersBuildPhase; 301 | buildActionMask = 2147483647; 302 | files = ( 303 | 35CA3D05BC6975806D641231605664C5 /* Pods-AGPullView_Tests-umbrella.h in Headers */, 304 | ); 305 | runOnlyForDeploymentPostprocessing = 0; 306 | }; 307 | 074221D7095C1F4A41E33A0E167CDC52 /* Headers */ = { 308 | isa = PBXHeadersBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | 7B5ABC2C89DE2DD1A74D3CF526A7D902 /* Pods-AGPullView_Example-umbrella.h in Headers */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 3BE4E6B74A908A195C4895CD80B6105F /* Headers */ = { 316 | isa = PBXHeadersBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 9167DE9B82C327181483D8841A1DC714 /* AGConfiguratorDelegate.h in Headers */, 320 | 1EA560B9C8FF9C8BE235DBBB87CA2B82 /* AGListViewAnimationButton.h in Headers */, 321 | 70926EBBD751EEBB7438DA2BE6298C7C /* AGPullMarginView.h in Headers */, 322 | 15AAAC4E9526B0B0A64C330EBCD8A0D7 /* AGPullView-iOS8.3-umbrella.h in Headers */, 323 | 74D20FAE49C9EDFD0F26DE45C7B0069E /* AGPullView.h in Headers */, 324 | 4D6B7B091FAD1EF249DC738B6000EECB /* AGPullViewConfigurator.h in Headers */, 325 | 609CE74942E7BC4DC9D8BC31C19F343D /* AGSettingsEnums.h in Headers */, 326 | ); 327 | runOnlyForDeploymentPostprocessing = 0; 328 | }; 329 | 798857BF895E6744A4AD131CD9523FD0 /* Headers */ = { 330 | isa = PBXHeadersBuildPhase; 331 | buildActionMask = 2147483647; 332 | files = ( 333 | F911F8D3A9958F4FD91344DED9F83BEE /* AGConfiguratorDelegate.h in Headers */, 334 | 5A7632B8BD4B2613691E9718450D508E /* AGListViewAnimationButton.h in Headers */, 335 | D00B12A8D343327CDC8D88D838A7558F /* AGPullMarginView.h in Headers */, 336 | F9F608751E8A304B3D8BA819F3D6FEED /* AGPullView-iOS8.0-umbrella.h in Headers */, 337 | EF15FA64190E548A0EC63E1656659F90 /* AGPullView.h in Headers */, 338 | 9CC5D7A6BFB67E596021268540ED1C67 /* AGPullViewConfigurator.h in Headers */, 339 | C598389C32C97A37993BA8D71E8A46FE /* AGSettingsEnums.h in Headers */, 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | /* End PBXHeadersBuildPhase section */ 344 | 345 | /* Begin PBXNativeTarget section */ 346 | 352B7AE7FEF0516FD555363638D056D9 /* AGPullView-iOS8.0 */ = { 347 | isa = PBXNativeTarget; 348 | buildConfigurationList = F9AF5D8D16F86874D89CC357A5271F95 /* Build configuration list for PBXNativeTarget "AGPullView-iOS8.0" */; 349 | buildPhases = ( 350 | FD73BB04B43161AAE10405FE5AE45719 /* Sources */, 351 | E9A9BC033AE42C200933114B26613659 /* Frameworks */, 352 | 798857BF895E6744A4AD131CD9523FD0 /* Headers */, 353 | ); 354 | buildRules = ( 355 | ); 356 | dependencies = ( 357 | ); 358 | name = "AGPullView-iOS8.0"; 359 | productName = "AGPullView-iOS8.0"; 360 | productReference = 2BFC71A6E2C7DB9766F1FEA4F699F45D /* AGPullView.framework */; 361 | productType = "com.apple.product-type.framework"; 362 | }; 363 | 3790FB2BF40E2F1ED5426A30D8EF7E45 /* Pods-AGPullView_Tests */ = { 364 | isa = PBXNativeTarget; 365 | buildConfigurationList = A959690E628DF9B5E72B0640283103D2 /* Build configuration list for PBXNativeTarget "Pods-AGPullView_Tests" */; 366 | buildPhases = ( 367 | 11955205E3209E866C0EC05C34A219CF /* Sources */, 368 | 7D9E2AF6E75E64CD0E88C00D14015BB1 /* Frameworks */, 369 | 014E834D608F17E93188F5EC0718FA80 /* Headers */, 370 | ); 371 | buildRules = ( 372 | ); 373 | dependencies = ( 374 | B0E76C3442A18DE1A71B688C12DC6D0A /* PBXTargetDependency */, 375 | ); 376 | name = "Pods-AGPullView_Tests"; 377 | productName = "Pods-AGPullView_Tests"; 378 | productReference = 8F9E2B7FDAD4B3CBB822C427E38C19C7 /* Pods_AGPullView_Tests.framework */; 379 | productType = "com.apple.product-type.framework"; 380 | }; 381 | 770D3D9DA9F4D9DD719291B6ABDD0B36 /* AGPullView-iOS8.3 */ = { 382 | isa = PBXNativeTarget; 383 | buildConfigurationList = B47ADF3CE3361242DA670DE9307D14BF /* Build configuration list for PBXNativeTarget "AGPullView-iOS8.3" */; 384 | buildPhases = ( 385 | 268565DDDBD68E4ECC31322868EF72BF /* Sources */, 386 | 389165C3D7F62C92C35C1326F131FF80 /* Frameworks */, 387 | 3BE4E6B74A908A195C4895CD80B6105F /* Headers */, 388 | ); 389 | buildRules = ( 390 | ); 391 | dependencies = ( 392 | ); 393 | name = "AGPullView-iOS8.3"; 394 | productName = "AGPullView-iOS8.3"; 395 | productReference = 3EE96C571EC8184E09CB1B228662A7B4 /* AGPullView.framework */; 396 | productType = "com.apple.product-type.framework"; 397 | }; 398 | BC956B8866D03F94F93878B7D1ECA139 /* Pods-AGPullView_Example */ = { 399 | isa = PBXNativeTarget; 400 | buildConfigurationList = 5E5141A569C10834F20E65FA481F90BE /* Build configuration list for PBXNativeTarget "Pods-AGPullView_Example" */; 401 | buildPhases = ( 402 | C6C3B692917EABE8AE575178606CA03B /* Sources */, 403 | 67FB8F3733E33AAC4F1AB9A072F1528D /* Frameworks */, 404 | 074221D7095C1F4A41E33A0E167CDC52 /* Headers */, 405 | ); 406 | buildRules = ( 407 | ); 408 | dependencies = ( 409 | 2D7E7EB022A6EED371677F5DF32FD296 /* PBXTargetDependency */, 410 | ); 411 | name = "Pods-AGPullView_Example"; 412 | productName = "Pods-AGPullView_Example"; 413 | productReference = 969814ACCA60131B1B8FDD0BEE7AE94F /* Pods_AGPullView_Example.framework */; 414 | productType = "com.apple.product-type.framework"; 415 | }; 416 | /* End PBXNativeTarget section */ 417 | 418 | /* Begin PBXProject section */ 419 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 420 | isa = PBXProject; 421 | attributes = { 422 | LastSwiftUpdateCheck = 0830; 423 | LastUpgradeCheck = 0700; 424 | }; 425 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 426 | compatibilityVersion = "Xcode 3.2"; 427 | developmentRegion = English; 428 | hasScannedForEncodings = 0; 429 | knownRegions = ( 430 | en, 431 | ); 432 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 433 | productRefGroup = 760C8A02672E1EFC625D2B2E94C6DBAC /* Products */; 434 | projectDirPath = ""; 435 | projectRoot = ""; 436 | targets = ( 437 | 352B7AE7FEF0516FD555363638D056D9 /* AGPullView-iOS8.0 */, 438 | 770D3D9DA9F4D9DD719291B6ABDD0B36 /* AGPullView-iOS8.3 */, 439 | BC956B8866D03F94F93878B7D1ECA139 /* Pods-AGPullView_Example */, 440 | 3790FB2BF40E2F1ED5426A30D8EF7E45 /* Pods-AGPullView_Tests */, 441 | ); 442 | }; 443 | /* End PBXProject section */ 444 | 445 | /* Begin PBXSourcesBuildPhase section */ 446 | 11955205E3209E866C0EC05C34A219CF /* Sources */ = { 447 | isa = PBXSourcesBuildPhase; 448 | buildActionMask = 2147483647; 449 | files = ( 450 | F1A3AE4B26A504CA2922FDABDB1AB732 /* Pods-AGPullView_Tests-dummy.m in Sources */, 451 | ); 452 | runOnlyForDeploymentPostprocessing = 0; 453 | }; 454 | 268565DDDBD68E4ECC31322868EF72BF /* Sources */ = { 455 | isa = PBXSourcesBuildPhase; 456 | buildActionMask = 2147483647; 457 | files = ( 458 | EFC210C1389FEEFB6C38ACA6B41F2257 /* AGListViewAnimationButton.m in Sources */, 459 | 465A6E3555EC6D0B9D16E24AF57FF6B8 /* AGPullMarginView.m in Sources */, 460 | B7D6C98F368D7167FD5D94D61F1EA7DF /* AGPullView-iOS8.3-dummy.m in Sources */, 461 | D1F739D1DF0E5F40AF19FBE16AE7199A /* AGPullView.m in Sources */, 462 | 4C2D6D85A5BD2186AD430B64F08A0B3A /* AGPullViewConfigurator.m in Sources */, 463 | ); 464 | runOnlyForDeploymentPostprocessing = 0; 465 | }; 466 | C6C3B692917EABE8AE575178606CA03B /* Sources */ = { 467 | isa = PBXSourcesBuildPhase; 468 | buildActionMask = 2147483647; 469 | files = ( 470 | 914A2D406FD9CBEAF79515615BAB0BD6 /* Pods-AGPullView_Example-dummy.m in Sources */, 471 | ); 472 | runOnlyForDeploymentPostprocessing = 0; 473 | }; 474 | FD73BB04B43161AAE10405FE5AE45719 /* Sources */ = { 475 | isa = PBXSourcesBuildPhase; 476 | buildActionMask = 2147483647; 477 | files = ( 478 | B4D939D1A188CB447117DC890C33B300 /* AGListViewAnimationButton.m in Sources */, 479 | 3A149F023B3FD497A9CD61E19A73CAD3 /* AGPullMarginView.m in Sources */, 480 | 4E45729F93EE7C85B371EE402CDC8B7A /* AGPullView-iOS8.0-dummy.m in Sources */, 481 | 720CF75948AB6934C0CDD74486B0C5B5 /* AGPullView.m in Sources */, 482 | F9CF824AB3E8B46FE207832CBFCFEBC9 /* AGPullViewConfigurator.m in Sources */, 483 | ); 484 | runOnlyForDeploymentPostprocessing = 0; 485 | }; 486 | /* End PBXSourcesBuildPhase section */ 487 | 488 | /* Begin PBXTargetDependency section */ 489 | 2D7E7EB022A6EED371677F5DF32FD296 /* PBXTargetDependency */ = { 490 | isa = PBXTargetDependency; 491 | name = "AGPullView-iOS8.0"; 492 | target = 352B7AE7FEF0516FD555363638D056D9 /* AGPullView-iOS8.0 */; 493 | targetProxy = 57F9EBA052BB3BD428766E19F1C69542 /* PBXContainerItemProxy */; 494 | }; 495 | B0E76C3442A18DE1A71B688C12DC6D0A /* PBXTargetDependency */ = { 496 | isa = PBXTargetDependency; 497 | name = "AGPullView-iOS8.3"; 498 | target = 770D3D9DA9F4D9DD719291B6ABDD0B36 /* AGPullView-iOS8.3 */; 499 | targetProxy = F3DF6A9C02E235DCE794CB5943B1B99F /* PBXContainerItemProxy */; 500 | }; 501 | /* End PBXTargetDependency section */ 502 | 503 | /* Begin XCBuildConfiguration section */ 504 | 34FE9531DA9AF2820790339988D5FF41 /* Release */ = { 505 | isa = XCBuildConfiguration; 506 | buildSettings = { 507 | ALWAYS_SEARCH_USER_PATHS = NO; 508 | CLANG_ANALYZER_NONNULL = YES; 509 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; 510 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 511 | CLANG_CXX_LIBRARY = "libc++"; 512 | CLANG_ENABLE_MODULES = YES; 513 | CLANG_ENABLE_OBJC_ARC = YES; 514 | CLANG_WARN_BOOL_CONVERSION = YES; 515 | CLANG_WARN_CONSTANT_CONVERSION = YES; 516 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 517 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 518 | CLANG_WARN_EMPTY_BODY = YES; 519 | CLANG_WARN_ENUM_CONVERSION = YES; 520 | CLANG_WARN_INFINITE_RECURSION = YES; 521 | CLANG_WARN_INT_CONVERSION = YES; 522 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 523 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 524 | CLANG_WARN_UNREACHABLE_CODE = YES; 525 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 526 | CODE_SIGNING_REQUIRED = NO; 527 | COPY_PHASE_STRIP = YES; 528 | ENABLE_NS_ASSERTIONS = NO; 529 | GCC_C_LANGUAGE_STANDARD = gnu99; 530 | GCC_PREPROCESSOR_DEFINITIONS = ( 531 | "POD_CONFIGURATION_RELEASE=1", 532 | "$(inherited)", 533 | ); 534 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 535 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 536 | GCC_WARN_UNDECLARED_SELECTOR = YES; 537 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 538 | GCC_WARN_UNUSED_FUNCTION = YES; 539 | GCC_WARN_UNUSED_VARIABLE = YES; 540 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 541 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 542 | STRIP_INSTALLED_PRODUCT = NO; 543 | SYMROOT = "${SRCROOT}/../build"; 544 | VALIDATE_PRODUCT = YES; 545 | }; 546 | name = Release; 547 | }; 548 | 5A21CEB1228EFC634FCD27E9DDA6C3A8 /* Debug */ = { 549 | isa = XCBuildConfiguration; 550 | baseConfigurationReference = 0EE87D5006BCF2FB6E92123C723BE416 /* AGPullView-iOS8.3.xcconfig */; 551 | buildSettings = { 552 | CODE_SIGN_IDENTITY = ""; 553 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 554 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 555 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 556 | CURRENT_PROJECT_VERSION = 1; 557 | DEBUG_INFORMATION_FORMAT = dwarf; 558 | DEFINES_MODULE = YES; 559 | DYLIB_COMPATIBILITY_VERSION = 1; 560 | DYLIB_CURRENT_VERSION = 1; 561 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 562 | ENABLE_STRICT_OBJC_MSGSEND = YES; 563 | GCC_NO_COMMON_BLOCKS = YES; 564 | GCC_PREFIX_HEADER = "Target Support Files/AGPullView-iOS8.3/AGPullView-iOS8.3-prefix.pch"; 565 | INFOPLIST_FILE = "Target Support Files/AGPullView-iOS8.3/Info.plist"; 566 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 567 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 568 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 569 | MODULEMAP_FILE = "Target Support Files/AGPullView-iOS8.3/AGPullView-iOS8.3.modulemap"; 570 | MTL_ENABLE_DEBUG_INFO = YES; 571 | PRODUCT_NAME = AGPullView; 572 | SDKROOT = iphoneos; 573 | SKIP_INSTALL = YES; 574 | TARGETED_DEVICE_FAMILY = "1,2"; 575 | VERSIONING_SYSTEM = "apple-generic"; 576 | VERSION_INFO_PREFIX = ""; 577 | }; 578 | name = Debug; 579 | }; 580 | 687B3D57791C29A9260CBEBE88F4B3E2 /* Debug */ = { 581 | isa = XCBuildConfiguration; 582 | baseConfigurationReference = 7DD7ECAE4FECD7993465F114DE226EC3 /* Pods-AGPullView_Tests.debug.xcconfig */; 583 | buildSettings = { 584 | CODE_SIGN_IDENTITY = ""; 585 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 586 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 587 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 588 | CURRENT_PROJECT_VERSION = 1; 589 | DEBUG_INFORMATION_FORMAT = dwarf; 590 | DEFINES_MODULE = YES; 591 | DYLIB_COMPATIBILITY_VERSION = 1; 592 | DYLIB_CURRENT_VERSION = 1; 593 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 594 | ENABLE_STRICT_OBJC_MSGSEND = YES; 595 | GCC_NO_COMMON_BLOCKS = YES; 596 | INFOPLIST_FILE = "Target Support Files/Pods-AGPullView_Tests/Info.plist"; 597 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 598 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 599 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 600 | MACH_O_TYPE = staticlib; 601 | MODULEMAP_FILE = "Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests.modulemap"; 602 | MTL_ENABLE_DEBUG_INFO = YES; 603 | OTHER_LDFLAGS = ""; 604 | OTHER_LIBTOOLFLAGS = ""; 605 | PODS_ROOT = "$(SRCROOT)"; 606 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 607 | PRODUCT_NAME = Pods_AGPullView_Tests; 608 | SDKROOT = iphoneos; 609 | SKIP_INSTALL = YES; 610 | TARGETED_DEVICE_FAMILY = "1,2"; 611 | VERSIONING_SYSTEM = "apple-generic"; 612 | VERSION_INFO_PREFIX = ""; 613 | }; 614 | name = Debug; 615 | }; 616 | 943933822C6F8978132CE5CB12C3F12B /* Release */ = { 617 | isa = XCBuildConfiguration; 618 | baseConfigurationReference = E8675E125DFD973812BA9000EA4F48CB /* Pods-AGPullView_Example.release.xcconfig */; 619 | buildSettings = { 620 | CODE_SIGN_IDENTITY = ""; 621 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 622 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 623 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 624 | CURRENT_PROJECT_VERSION = 1; 625 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 626 | DEFINES_MODULE = YES; 627 | DYLIB_COMPATIBILITY_VERSION = 1; 628 | DYLIB_CURRENT_VERSION = 1; 629 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 630 | ENABLE_STRICT_OBJC_MSGSEND = YES; 631 | GCC_NO_COMMON_BLOCKS = YES; 632 | INFOPLIST_FILE = "Target Support Files/Pods-AGPullView_Example/Info.plist"; 633 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 634 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 635 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 636 | MACH_O_TYPE = staticlib; 637 | MODULEMAP_FILE = "Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example.modulemap"; 638 | MTL_ENABLE_DEBUG_INFO = NO; 639 | OTHER_LDFLAGS = ""; 640 | OTHER_LIBTOOLFLAGS = ""; 641 | PODS_ROOT = "$(SRCROOT)"; 642 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 643 | PRODUCT_NAME = Pods_AGPullView_Example; 644 | SDKROOT = iphoneos; 645 | SKIP_INSTALL = YES; 646 | TARGETED_DEVICE_FAMILY = "1,2"; 647 | VERSIONING_SYSTEM = "apple-generic"; 648 | VERSION_INFO_PREFIX = ""; 649 | }; 650 | name = Release; 651 | }; 652 | 9B64ABD9C075A82202A63889792E6D18 /* Debug */ = { 653 | isa = XCBuildConfiguration; 654 | baseConfigurationReference = A70805736E8067AA67738287670197BF /* Pods-AGPullView_Example.debug.xcconfig */; 655 | buildSettings = { 656 | CODE_SIGN_IDENTITY = ""; 657 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 658 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 659 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 660 | CURRENT_PROJECT_VERSION = 1; 661 | DEBUG_INFORMATION_FORMAT = dwarf; 662 | DEFINES_MODULE = YES; 663 | DYLIB_COMPATIBILITY_VERSION = 1; 664 | DYLIB_CURRENT_VERSION = 1; 665 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 666 | ENABLE_STRICT_OBJC_MSGSEND = YES; 667 | GCC_NO_COMMON_BLOCKS = YES; 668 | INFOPLIST_FILE = "Target Support Files/Pods-AGPullView_Example/Info.plist"; 669 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 670 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 671 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 672 | MACH_O_TYPE = staticlib; 673 | MODULEMAP_FILE = "Target Support Files/Pods-AGPullView_Example/Pods-AGPullView_Example.modulemap"; 674 | MTL_ENABLE_DEBUG_INFO = YES; 675 | OTHER_LDFLAGS = ""; 676 | OTHER_LIBTOOLFLAGS = ""; 677 | PODS_ROOT = "$(SRCROOT)"; 678 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 679 | PRODUCT_NAME = Pods_AGPullView_Example; 680 | SDKROOT = iphoneos; 681 | SKIP_INSTALL = YES; 682 | TARGETED_DEVICE_FAMILY = "1,2"; 683 | VERSIONING_SYSTEM = "apple-generic"; 684 | VERSION_INFO_PREFIX = ""; 685 | }; 686 | name = Debug; 687 | }; 688 | C104F7F091290C3D1E248192F07FE689 /* Debug */ = { 689 | isa = XCBuildConfiguration; 690 | buildSettings = { 691 | ALWAYS_SEARCH_USER_PATHS = NO; 692 | CLANG_ANALYZER_NONNULL = YES; 693 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; 694 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 695 | CLANG_CXX_LIBRARY = "libc++"; 696 | CLANG_ENABLE_MODULES = YES; 697 | CLANG_ENABLE_OBJC_ARC = YES; 698 | CLANG_WARN_BOOL_CONVERSION = YES; 699 | CLANG_WARN_CONSTANT_CONVERSION = YES; 700 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 701 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 702 | CLANG_WARN_EMPTY_BODY = YES; 703 | CLANG_WARN_ENUM_CONVERSION = YES; 704 | CLANG_WARN_INFINITE_RECURSION = YES; 705 | CLANG_WARN_INT_CONVERSION = YES; 706 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 707 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 708 | CLANG_WARN_UNREACHABLE_CODE = YES; 709 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 710 | CODE_SIGNING_REQUIRED = NO; 711 | COPY_PHASE_STRIP = NO; 712 | ENABLE_TESTABILITY = YES; 713 | GCC_C_LANGUAGE_STANDARD = gnu99; 714 | GCC_DYNAMIC_NO_PIC = NO; 715 | GCC_OPTIMIZATION_LEVEL = 0; 716 | GCC_PREPROCESSOR_DEFINITIONS = ( 717 | "POD_CONFIGURATION_DEBUG=1", 718 | "DEBUG=1", 719 | "$(inherited)", 720 | ); 721 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 722 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 723 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 724 | GCC_WARN_UNDECLARED_SELECTOR = YES; 725 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 726 | GCC_WARN_UNUSED_FUNCTION = YES; 727 | GCC_WARN_UNUSED_VARIABLE = YES; 728 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 729 | ONLY_ACTIVE_ARCH = YES; 730 | PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; 731 | STRIP_INSTALLED_PRODUCT = NO; 732 | SYMROOT = "${SRCROOT}/../build"; 733 | }; 734 | name = Debug; 735 | }; 736 | C3A6895A19893C79DDB80C75D1169003 /* Release */ = { 737 | isa = XCBuildConfiguration; 738 | baseConfigurationReference = 0EE87D5006BCF2FB6E92123C723BE416 /* AGPullView-iOS8.3.xcconfig */; 739 | buildSettings = { 740 | CODE_SIGN_IDENTITY = ""; 741 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 742 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 743 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 744 | CURRENT_PROJECT_VERSION = 1; 745 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 746 | DEFINES_MODULE = YES; 747 | DYLIB_COMPATIBILITY_VERSION = 1; 748 | DYLIB_CURRENT_VERSION = 1; 749 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 750 | ENABLE_STRICT_OBJC_MSGSEND = YES; 751 | GCC_NO_COMMON_BLOCKS = YES; 752 | GCC_PREFIX_HEADER = "Target Support Files/AGPullView-iOS8.3/AGPullView-iOS8.3-prefix.pch"; 753 | INFOPLIST_FILE = "Target Support Files/AGPullView-iOS8.3/Info.plist"; 754 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 755 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 756 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 757 | MODULEMAP_FILE = "Target Support Files/AGPullView-iOS8.3/AGPullView-iOS8.3.modulemap"; 758 | MTL_ENABLE_DEBUG_INFO = NO; 759 | PRODUCT_NAME = AGPullView; 760 | SDKROOT = iphoneos; 761 | SKIP_INSTALL = YES; 762 | TARGETED_DEVICE_FAMILY = "1,2"; 763 | VERSIONING_SYSTEM = "apple-generic"; 764 | VERSION_INFO_PREFIX = ""; 765 | }; 766 | name = Release; 767 | }; 768 | C446B53A58124B9B06B6358667C7DB8B /* Release */ = { 769 | isa = XCBuildConfiguration; 770 | baseConfigurationReference = FAF93DE4E5052F57FDB495A23668B211 /* AGPullView-iOS8.0.xcconfig */; 771 | buildSettings = { 772 | CODE_SIGN_IDENTITY = ""; 773 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 774 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 775 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 776 | CURRENT_PROJECT_VERSION = 1; 777 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 778 | DEFINES_MODULE = YES; 779 | DYLIB_COMPATIBILITY_VERSION = 1; 780 | DYLIB_CURRENT_VERSION = 1; 781 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 782 | ENABLE_STRICT_OBJC_MSGSEND = YES; 783 | GCC_NO_COMMON_BLOCKS = YES; 784 | GCC_PREFIX_HEADER = "Target Support Files/AGPullView-iOS8.0/AGPullView-iOS8.0-prefix.pch"; 785 | INFOPLIST_FILE = "Target Support Files/AGPullView-iOS8.0/Info.plist"; 786 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 787 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 788 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 789 | MODULEMAP_FILE = "Target Support Files/AGPullView-iOS8.0/AGPullView-iOS8.0.modulemap"; 790 | MTL_ENABLE_DEBUG_INFO = NO; 791 | PRODUCT_NAME = AGPullView; 792 | SDKROOT = iphoneos; 793 | SKIP_INSTALL = YES; 794 | SWIFT_VERSION = 3.0; 795 | TARGETED_DEVICE_FAMILY = "1,2"; 796 | VERSIONING_SYSTEM = "apple-generic"; 797 | VERSION_INFO_PREFIX = ""; 798 | }; 799 | name = Release; 800 | }; 801 | F8F4F82CB8B28BEA8B127BDB76784682 /* Debug */ = { 802 | isa = XCBuildConfiguration; 803 | baseConfigurationReference = FAF93DE4E5052F57FDB495A23668B211 /* AGPullView-iOS8.0.xcconfig */; 804 | buildSettings = { 805 | CODE_SIGN_IDENTITY = ""; 806 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 807 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 808 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 809 | CURRENT_PROJECT_VERSION = 1; 810 | DEBUG_INFORMATION_FORMAT = dwarf; 811 | DEFINES_MODULE = YES; 812 | DYLIB_COMPATIBILITY_VERSION = 1; 813 | DYLIB_CURRENT_VERSION = 1; 814 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 815 | ENABLE_STRICT_OBJC_MSGSEND = YES; 816 | GCC_NO_COMMON_BLOCKS = YES; 817 | GCC_PREFIX_HEADER = "Target Support Files/AGPullView-iOS8.0/AGPullView-iOS8.0-prefix.pch"; 818 | INFOPLIST_FILE = "Target Support Files/AGPullView-iOS8.0/Info.plist"; 819 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 820 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 821 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 822 | MODULEMAP_FILE = "Target Support Files/AGPullView-iOS8.0/AGPullView-iOS8.0.modulemap"; 823 | MTL_ENABLE_DEBUG_INFO = YES; 824 | PRODUCT_NAME = AGPullView; 825 | SDKROOT = iphoneos; 826 | SKIP_INSTALL = YES; 827 | SWIFT_VERSION = 3.0; 828 | TARGETED_DEVICE_FAMILY = "1,2"; 829 | VERSIONING_SYSTEM = "apple-generic"; 830 | VERSION_INFO_PREFIX = ""; 831 | }; 832 | name = Debug; 833 | }; 834 | FE0C85A81C132A6FF7F10A9AC6416A6C /* Release */ = { 835 | isa = XCBuildConfiguration; 836 | baseConfigurationReference = 2949134B8123D8C290841E58EC774CBA /* Pods-AGPullView_Tests.release.xcconfig */; 837 | buildSettings = { 838 | CODE_SIGN_IDENTITY = ""; 839 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 840 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 841 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 842 | CURRENT_PROJECT_VERSION = 1; 843 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 844 | DEFINES_MODULE = YES; 845 | DYLIB_COMPATIBILITY_VERSION = 1; 846 | DYLIB_CURRENT_VERSION = 1; 847 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 848 | ENABLE_STRICT_OBJC_MSGSEND = YES; 849 | GCC_NO_COMMON_BLOCKS = YES; 850 | INFOPLIST_FILE = "Target Support Files/Pods-AGPullView_Tests/Info.plist"; 851 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 852 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 853 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 854 | MACH_O_TYPE = staticlib; 855 | MODULEMAP_FILE = "Target Support Files/Pods-AGPullView_Tests/Pods-AGPullView_Tests.modulemap"; 856 | MTL_ENABLE_DEBUG_INFO = NO; 857 | OTHER_LDFLAGS = ""; 858 | OTHER_LIBTOOLFLAGS = ""; 859 | PODS_ROOT = "$(SRCROOT)"; 860 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 861 | PRODUCT_NAME = Pods_AGPullView_Tests; 862 | SDKROOT = iphoneos; 863 | SKIP_INSTALL = YES; 864 | TARGETED_DEVICE_FAMILY = "1,2"; 865 | VERSIONING_SYSTEM = "apple-generic"; 866 | VERSION_INFO_PREFIX = ""; 867 | }; 868 | name = Release; 869 | }; 870 | /* End XCBuildConfiguration section */ 871 | 872 | /* Begin XCConfigurationList section */ 873 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 874 | isa = XCConfigurationList; 875 | buildConfigurations = ( 876 | C104F7F091290C3D1E248192F07FE689 /* Debug */, 877 | 34FE9531DA9AF2820790339988D5FF41 /* Release */, 878 | ); 879 | defaultConfigurationIsVisible = 0; 880 | defaultConfigurationName = Release; 881 | }; 882 | 5E5141A569C10834F20E65FA481F90BE /* Build configuration list for PBXNativeTarget "Pods-AGPullView_Example" */ = { 883 | isa = XCConfigurationList; 884 | buildConfigurations = ( 885 | 9B64ABD9C075A82202A63889792E6D18 /* Debug */, 886 | 943933822C6F8978132CE5CB12C3F12B /* Release */, 887 | ); 888 | defaultConfigurationIsVisible = 0; 889 | defaultConfigurationName = Release; 890 | }; 891 | A959690E628DF9B5E72B0640283103D2 /* Build configuration list for PBXNativeTarget "Pods-AGPullView_Tests" */ = { 892 | isa = XCConfigurationList; 893 | buildConfigurations = ( 894 | 687B3D57791C29A9260CBEBE88F4B3E2 /* Debug */, 895 | FE0C85A81C132A6FF7F10A9AC6416A6C /* Release */, 896 | ); 897 | defaultConfigurationIsVisible = 0; 898 | defaultConfigurationName = Release; 899 | }; 900 | B47ADF3CE3361242DA670DE9307D14BF /* Build configuration list for PBXNativeTarget "AGPullView-iOS8.3" */ = { 901 | isa = XCConfigurationList; 902 | buildConfigurations = ( 903 | 5A21CEB1228EFC634FCD27E9DDA6C3A8 /* Debug */, 904 | C3A6895A19893C79DDB80C75D1169003 /* Release */, 905 | ); 906 | defaultConfigurationIsVisible = 0; 907 | defaultConfigurationName = Release; 908 | }; 909 | F9AF5D8D16F86874D89CC357A5271F95 /* Build configuration list for PBXNativeTarget "AGPullView-iOS8.0" */ = { 910 | isa = XCConfigurationList; 911 | buildConfigurations = ( 912 | F8F4F82CB8B28BEA8B127BDB76784682 /* Debug */, 913 | C446B53A58124B9B06B6358667C7DB8B /* Release */, 914 | ); 915 | defaultConfigurationIsVisible = 0; 916 | defaultConfigurationName = Release; 917 | }; 918 | /* End XCConfigurationList section */ 919 | }; 920 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 921 | } 922 | -------------------------------------------------------------------------------- /Example/Tests/Tests-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 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Tests/Tests-Prefix.pch: -------------------------------------------------------------------------------- 1 | // The contents of this file are implicitly included at the beginning of every test case source file. 2 | 3 | #ifdef __OBJC__ 4 | 5 | 6 | 7 | #endif 8 | -------------------------------------------------------------------------------- /Example/Tests/Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // AGPullViewTests.m 3 | // AGPullViewTests 4 | // 5 | // Created by Aleksey Getman on 07/15/2016. 6 | // Copyright (c) 2016 Aleksey Getman. All rights reserved. 7 | // 8 | 9 | @import XCTest; 10 | 11 | @interface Tests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation Tests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | 36 | -------------------------------------------------------------------------------- /Example/Tests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Aleksey Getman 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AGPullView 2 | 3 | [![Version](https://img.shields.io/cocoapods/v/AGPullView.svg?style=flat)](http://cocoapods.org/pods/AGPullView) 4 | [![License](https://img.shields.io/cocoapods/l/AGPullView.svg?style=flat)](http://cocoapods.org/pods/AGPullView) 5 | [![Platform](https://img.shields.io/cocoapods/p/AGPullView.svg?style=flat)](http://cocoapods.org/pods/AGPullView) 6 | 7 | ## Example 8 | 9 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 10 | 11 | ## Requirements 12 | 13 | iOS 8.0 + 14 | 15 | ## Installation 16 | 17 | AGPullView is available through [CocoaPods](http://cocoapods.org). To install 18 | it, simply add the following line to your Podfile: 19 | 20 | ```ruby 21 | pod "AGPullView" 22 | ``` 23 | 24 | # Demo 25 | 26 | Short demo of AGPullView performance. 27 | 28 | 29 | ![Demo](https://s32.postimg.org/vgslyjjed/AGPull_View_demo.gif) 30 | 31 | 32 | ---------- 33 | 34 | 35 | # Usage 36 | 37 | First, import AGPullViewConfigurator 38 | For SWIFT - you should import AGPullViewConfigurator in bridging header first to use AGPullView 39 | 40 | ```ObjC 41 | import "AGPullViewConfigurator.h" 42 | ``` 43 | 44 | 45 | ---------- 46 | 47 | 48 | ### Initialization 49 | 50 | Just use standart initialization 51 | 52 | *Objective-C* 53 | ```ObjC 54 | self.configurator = [AGPullViewConfigurator new]; 55 | ``` 56 | *SWIFT* 57 | ```Swift 58 | let configurator = AGPullViewConfigurator() 59 | ``` 60 | 61 | 62 | ---------- 63 | 64 | 65 | ### Setting up 66 | Then setup AGPullView for your view like so (white preset color scheme - default): 67 | 68 | *Objective-C* 69 | ```ObjC 70 | [self.configurator setupPullViewForSuperview:self.view]; 71 | ``` 72 | *SWIFT* 73 | ```Swift 74 | self.configurator.setupPullView(forSuperview: self.view) 75 | ``` 76 | 77 | Or you can setup AGPullView with one of preset color schemes 78 | 79 | *Objective-C* 80 | ```ObjC 81 | [self.configurator setupPullViewForSuperview:self.view colorScheme:ColorSchemeTypeGrayTransparent]; 82 | ``` 83 | *SWIFT* 84 | ```Swift 85 | self.configurator.setupPullView(forSuperview: self.view, colorScheme:ColorSchemeTypeDarkTransparent) 86 | ``` 87 | 88 | Then you also should override several your superview's UIResponder methods with calling AGPullView methods there: 89 | 90 | *Objective-C* 91 | ```ObjC 92 | - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 93 | [self.configurator handleTouchesBegan:touches]; 94 | } 95 | 96 | - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 97 | [self.configurator handleTouchesMoved:touches]; 98 | } 99 | 100 | - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 101 | [self.configurator handleTouchesEnded:touches]; 102 | } 103 | ``` 104 | *SWIFT* 105 | ```Swift 106 | override func touchesBegan(_ touches: Set, with event: UIEvent?) { 107 | self.configurator.handleTouchesBegan(touches) 108 | } 109 | 110 | override func touchesMoved(_ touches: Set, with event: UIEvent?) { 111 | self.configurator.handleTouchesMoved(touches) 112 | } 113 | 114 | override func touchesEnded(_ touches: Set, with event: UIEvent?) { 115 | self.configurator.handleTouchesEnded(touches) 116 | } 117 | ``` 118 | 119 | Great! Now your AGPullView is ready for using! 120 | 121 | 122 | ---------- 123 | 124 | 125 | ### Delegation 126 | 127 | Use AGconfiguratorDelegate methods for full control 128 | ```ObjC 129 | self.configurator.delegate 130 | ``` 131 | 132 | 133 | ---------- 134 | 135 | 136 | ### Customization 137 | You can fill AGPullView with your content by accessing property contentView like so: 138 | ```ObjC 139 | self.configurator.contentView 140 | ``` 141 | 142 | There is also a convenient method for filling whole content view with your content (ex. UITableView). It will also create necessary constraints for you. 143 | 144 | *Objective-C* 145 | ```ObjC 146 | [self.configurator fullfillContentViewWithView:tableView]; 147 | ``` 148 | *SWIFT* 149 | ```Swift 150 | self.configurator.fullfillContentView(with: table) 151 | ``` 152 | 153 | You can turn on/off blur effect like so: 154 | 155 | 1) *ON* 156 | 157 | *Objective-C* 158 | ```ObjC 159 | [self.configurator enableBlurEffectWithBlurStyle:UIBlurEffectStyleLight]; 160 | ``` 161 | *SWIFT* 162 | ```Swift 163 | self.configurator.enableBlurEffect(withBlurStyle: .dark) 164 | ``` 165 | 2) *OFF* 166 | 167 | *Objective-C* 168 | ```ObjC 169 | [self.configurator undoBlurEffect]; 170 | ``` 171 | *SWIFT* 172 | ```Swift 173 | self.configurator.undoBlurEffect() 174 | ``` 175 | 176 | Animation control is provided with these useful methods: 177 | 178 | *Objective-C* 179 | ```ObjC 180 | self.configurator.enableShowingWithTouch = YES; 181 | self.configurator.enableHidingWithTouch = YES; 182 | 183 | [self.configurator hideAnimated:YES]; 184 | [self.configurator showAnimated:YES]; 185 | ``` 186 | *SWIFT* 187 | ```Swift 188 | self.configurator.enableShowingWithTouch = true; 189 | self.configurator.enableHidingWithTouch = true; 190 | 191 | self.configurator.hide(animated: true) 192 | self.configurator.hide(animated: true) 193 | ``` 194 | 195 | There is batch of useful settings for your AGPullView instance: 196 | ```ObjC 197 | self.configurator.colorSchemeType 198 | 199 | self.configurator.animationDuration 200 | 201 | self.configurator.blurStyle 202 | 203 | self.configurator.needBounceEffect 204 | 205 | self.configurator.percentOfFilling 206 | ``` 207 | 208 | AGPullView uses KVO, so some performance can be changed in runtime with theese properties 209 | ```ObjC 210 | self.configurator.enableShowingWithTouch 211 | self.configurator.enableHidingWithTouch 212 | self.configurator.blurStyle 213 | self.configurator.colorSchemeType 214 | ``` 215 | 216 | 217 | ---------- 218 | 219 | 220 | And here is a demo of random changing properties 'blurStyle' and 'colorSchemeType' 221 | 222 | ![Demo](https://media.giphy.com/media/2AmsmlYktMzFS/giphy.gif) 223 | 224 | ## Author 225 | 226 | Aleksey Getman, getmanag@gmail.com 227 | 228 | ## License 229 | 230 | AGPullView is available under the MIT license. See the LICENSE file for more info. 231 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj --------------------------------------------------------------------------------