├── LICENSE.txt ├── ScrollBarTagView ├── Assets.xcassets │ ├── Contents.json │ ├── elipse.imageset │ │ ├── elipse@2x.png │ │ └── Contents.json │ ├── d_shuttle.imageset │ │ ├── d_shuttle@2x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Default-568h@2x.png ├── TagView │ ├── TagView.h │ ├── TagView.m │ └── TagView.xib ├── AppDelegate.h ├── main.m ├── ViewController │ ├── ViewController.h │ ├── ViewController.m │ └── ViewController.xib ├── AppDelegate.m ├── ScrollBarTagView │ ├── ScrollBarTagView.h │ └── ScrollBarTagView.m ├── Info.plist └── Base.lproj │ └── LaunchScreen.storyboard ├── ScrollBarTagView.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── daisuke.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── ScrollBarTagView.xcscheme └── project.pbxproj ├── ScrollBarTagView.podspec ├── README.md ├── ScrollBarTagViewTests ├── Info.plist └── ScrollBarTagViewTests.m ├── ScrollBarTagViewUITests ├── Info.plist └── ScrollBarTagViewUITests.m ├── .github └── workflows │ └── static.yml └── .gitignore /LICENSE.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ScrollBarTagView/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dse12345z/ScrollBarTagView/HEAD/ScrollBarTagView/Default-568h@2x.png -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.xcassets/elipse.imageset/elipse@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dse12345z/ScrollBarTagView/HEAD/ScrollBarTagView/Assets.xcassets/elipse.imageset/elipse@2x.png -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.xcassets/d_shuttle.imageset/d_shuttle@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dse12345z/ScrollBarTagView/HEAD/ScrollBarTagView/Assets.xcassets/d_shuttle.imageset/d_shuttle@2x.png -------------------------------------------------------------------------------- /ScrollBarTagView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ScrollBarTagView/TagView/TagView.h: -------------------------------------------------------------------------------- 1 | // 2 | // TagView.h 3 | // Demo 4 | // 5 | // Created by daisuke on 2015/11/30. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TagView : UIView 12 | 13 | @property (weak, nonatomic) IBOutlet UILabel *addressLabel; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ScrollBarTagView/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end -------------------------------------------------------------------------------- /ScrollBarTagView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.xcassets/elipse.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "elipse@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.xcassets/d_shuttle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "d_shuttle@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ScrollBarTagView/ViewController/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ScrollBarTagView.h" 11 | #import "TagView.h" 12 | 13 | @interface ViewController : UIViewController 14 | 15 | @property (weak, nonatomic) IBOutlet UITableView *listTableView; 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /ScrollBarTagView/TagView/TagView.m: -------------------------------------------------------------------------------- 1 | // 2 | // TagView.m 3 | // Demo 4 | // 5 | // Created by daisuke on 2015/11/30. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import "TagView.h" 10 | 11 | @implementation TagView 12 | 13 | #pragma mark - life cycle 14 | 15 | - (id)initWithFrame:(CGRect)frame { 16 | self = [super initWithFrame:frame]; 17 | if (self) { 18 | NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; 19 | self = arrayOfViews[0]; 20 | } 21 | return self; 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ScrollBarTagView/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "ViewController.h" 11 | 12 | @implementation AppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 15 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 16 | self.window.rootViewController = [ViewController new]; 17 | [self.window makeKeyAndVisible]; 18 | return YES; 19 | } 20 | 21 | @end -------------------------------------------------------------------------------- /ScrollBarTagView.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'ScrollBarTagView' 3 | s.version = '1.0.1' 4 | s.summary = 'Add a custom TagView on ScrollViewBar, with ScrollViewBar scroll. Can displayed something info on the TagView.' 5 | s.homepage = 'https://github.com/dse12345z/ScrollBarTagView' 6 | s.license = { :type => 'MIT', :file => 'LICENSE' } 7 | s.author = { 'Daisuke' => 'dse12345z@gmail.com' } 8 | s.source = { :git => 'https://github.com/dse12345z/ScrollBarTagView.git', :tag => "v#{s.version}" } 9 | s.platform = :ios, '7.0' 10 | s.source_files = 'ScrollBarTagView/ScrollBarTagView/*.{h,m}' 11 | s.requires_arc = true 12 | end 13 | -------------------------------------------------------------------------------- /ScrollBarTagView/ScrollBarTagView/ScrollBarTagView.h: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollBarTagView.h 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/11/27. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #define tagViewGap 10 12 | 13 | typedef void (^ScrollBlock)(id scrollBarTagView, id tagView, CGFloat offset); 14 | 15 | @interface ScrollBarTagView : NSObject 16 | 17 | @property (nonatomic, assign) CGFloat stayOffset; 18 | 19 | + (void)initWithScrollView:(UIScrollView *)scrollView withTagView:(UIView *)tagView didScroll:(ScrollBlock)scrollBlock; 20 | 21 | - (void)showTagViewAnimation; 22 | - (void)hiddenTagViewAnimation; 23 | 24 | @end -------------------------------------------------------------------------------- /ScrollBarTagView/Assets.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" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ScrollBarTagView 2 | ============= 3 | ![alt tag](http://i.imgur.com/fKq70uf.gif) 4 | 5 | Installation 6 | ============= 7 | 8 | #### Common 9 | 10 | copy ScrollBarTagView folder (ScrollBarTagView.h / ScrollBarTagView.m) 11 | 12 | #### From CocoaPods 13 | 14 | 1.add the following line to your Podfile: 15 | 16 | pod 'ScrollBarTagView', '~> 1.0.1' 17 | 18 | 2.install ScrollBarTagView into your project: 19 | 20 | pod install 21 | 22 | Usage 23 | ============= 24 | 25 | 1.create yourself tagView 26 | 27 | 2.- (void)viewDidAppear written under the code 28 | 29 | [ScrollBarTagView initWithScrollView:yourScrollView 30 | withTagView:yourTagView 31 | didScroll: ^(id scrollBarTagView, id tagView, CGFloat offset) { 32 | // Scroll to change your tagView 33 | }]; 34 | -------------------------------------------------------------------------------- /ScrollBarTagViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ScrollBarTagViewUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ScrollBarTagView.xcodeproj/xcuserdata/daisuke.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ScrollBarTagView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 7EB7BE311C0D414F007CB933 16 | 17 | primary 18 | 19 | 20 | 7EB7BE4A1C0D414F007CB933 21 | 22 | primary 23 | 24 | 25 | 7EB7BE551C0D414F007CB933 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /ScrollBarTagViewTests/ScrollBarTagViewTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollBarTagViewTests.m 3 | // ScrollBarTagViewTests 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ScrollBarTagViewTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ScrollBarTagViewTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ScrollBarTagView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /ScrollBarTagViewUITests/ScrollBarTagViewUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollBarTagViewUITests.m 3 | // ScrollBarTagViewUITests 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ScrollBarTagViewUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation ScrollBarTagViewUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /ScrollBarTagView/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy static content to Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ["master"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 20 | concurrency: 21 | group: "pages" 22 | cancel-in-progress: false 23 | 24 | jobs: 25 | # Single deploy job since we're just deploying 26 | deploy: 27 | environment: 28 | # Must be set to this for deploying to GitHub Pages 29 | name: github-pages 30 | url: ${{ steps.deployment.outputs.page_url }} 31 | runs-on: macos-12 32 | steps: 33 | - name: Checkout 🛎️ 34 | uses: actions/checkout@v3 35 | - name: Build DocC 36 | run: | 37 | xcodebuild docbuild -scheme MyPackage \ 38 | -derivedDataPath /tmp/docbuild \ 39 | -destination 'generic/platform=iOS'; 40 | $(xcrun --find docc) process-archive \ 41 | transform-for-static-hosting /tmp/docbuild/Build/Products/Debug-iphoneos/MyPackage.doccarchive \ 42 | --hosting-base-path MyPackage \ 43 | --output-path docs; 44 | echo "" > docs/index.html; 45 | - name: Upload artifact 46 | uses: actions/upload-pages-artifact@v1 47 | with: 48 | # Upload only docs directory 49 | path: 'docs' 50 | - name: Deploy to GitHub Pages 51 | id: deployment 52 | uses: actions/deploy-pages@v1 53 | -------------------------------------------------------------------------------- /ScrollBarTagView/ViewController/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/12/1. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @implementation ViewController 12 | 13 | #pragma mark - UITableViewDelegate 14 | 15 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 16 | return 150; 17 | } 18 | 19 | #pragma mark - UITableViewDataSource 20 | 21 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 22 | static NSString *cellIdentifier = @"cell"; 23 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 24 | if (!cell) { 25 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 26 | } 27 | cell.textLabel.text = [NSString stringWithFormat:@"%td", indexPath.row]; 28 | return cell; 29 | } 30 | 31 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 32 | return 100; 33 | } 34 | 35 | #pragma mark - private method 36 | 37 | - (void)setupScrollBarTagView { 38 | __weak typeof(self) weakSelf = self; 39 | [ScrollBarTagView initWithScrollView:self.listTableView withTagView:[TagView new] didScroll: ^(id scrollBarTagView, TagView *tagView, CGFloat offset) { 40 | [scrollBarTagView showTagViewAnimation]; 41 | CGPoint point = [weakSelf.view convertPoint:tagView.center toView:weakSelf.listTableView]; 42 | NSArray *cells = [weakSelf.listTableView visibleCells]; 43 | NSString *addressLabel = @"0"; 44 | for (UITableViewCell *cell in cells) { 45 | if (CGRectContainsPoint(cell.frame, point)) { 46 | addressLabel = [NSString stringWithFormat:@"%tdkm", [weakSelf.listTableView indexPathForCell:cell].row]; 47 | break; 48 | } 49 | } 50 | tagView.addressLabel.text = addressLabel; 51 | }]; 52 | } 53 | 54 | #pragma mark - life cycle 55 | 56 | - (void)viewDidAppear:(BOOL)animated { 57 | [super viewDidAppear:animated]; 58 | [self setupScrollBarTagView]; 59 | } 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/xcode,osx,objective-c 2 | 3 | ### Xcode ### 4 | # Xcode 5 | # 6 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 7 | 8 | ## Build generated 9 | build/ 10 | DerivedData 11 | 12 | ## Various settings 13 | *.pbxuser 14 | !default.pbxuser 15 | *.mode1v3 16 | !default.mode1v3 17 | *.mode2v3 18 | !default.mode2v3 19 | *.perspectivev3 20 | !default.perspectivev3 21 | xcuserdata 22 | 23 | ## Other 24 | *.xccheckout 25 | *.moved-aside 26 | *.xcuserstate 27 | 28 | 29 | ### OSX ### 30 | .DS_Store 31 | .AppleDouble 32 | .LSOverride 33 | 34 | # Icon must end with two \r 35 | Icon 36 | 37 | 38 | # Thumbnails 39 | ._* 40 | 41 | # Files that might appear in the root of a volume 42 | .DocumentRevisions-V100 43 | .fseventsd 44 | .Spotlight-V100 45 | .TemporaryItems 46 | .Trashes 47 | .VolumeIcon.icns 48 | 49 | # Directories potentially created on remote AFP share 50 | .AppleDB 51 | .AppleDesktop 52 | Network Trash Folder 53 | Temporary Items 54 | .apdisk 55 | 56 | 57 | ### Objective-C ### 58 | # Xcode 59 | # 60 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 61 | 62 | ## Build generated 63 | build/ 64 | DerivedData 65 | 66 | ## Various settings 67 | *.pbxuser 68 | !default.pbxuser 69 | *.mode1v3 70 | !default.mode1v3 71 | *.mode2v3 72 | !default.mode2v3 73 | *.perspectivev3 74 | !default.perspectivev3 75 | xcuserdata 76 | 77 | ## Other 78 | *.xccheckout 79 | *.moved-aside 80 | *.xcuserstate 81 | *.xcscmblueprint 82 | 83 | ## Obj-C/Swift specific 84 | *.hmap 85 | *.ipa 86 | 87 | # CocoaPods 88 | # 89 | # We recommend against adding the Pods directory to your .gitignore. However 90 | # you should judge for yourself, the pros and cons are mentioned at: 91 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 92 | # 93 | #Pods/ 94 | 95 | # Carthage 96 | # 97 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 98 | # Carthage/Checkouts 99 | 100 | Carthage/Build 101 | 102 | ### Objective-C Patch ### 103 | *.xcscmblueprint 104 | -------------------------------------------------------------------------------- /ScrollBarTagView/ViewController/ViewController.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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /ScrollBarTagView/TagView/TagView.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ScrollBarTagView.xcodeproj/xcuserdata/daisuke.xcuserdatad/xcschemes/ScrollBarTagView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /ScrollBarTagView/ScrollBarTagView/ScrollBarTagView.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollBarTagView.m 3 | // ScrollBarTagView 4 | // 5 | // Created by daisuke on 2015/11/27. 6 | // Copyright © 2015年 dse12345z. All rights reserved. 7 | // 8 | 9 | #import "ScrollBarTagView.h" 10 | #import 11 | 12 | @interface ScrollBarTagView () 13 | 14 | @property (nonatomic, weak) UIScrollView *scrollView; 15 | @property (nonatomic, strong) UIView *tagView; 16 | @property (nonatomic, strong) UIImageView *scrollViewBarImgView; 17 | @property (nonatomic, copy) ScrollBlock scrollBlock; 18 | @property (nonatomic, assign) BOOL isStopHiddenAnimation; 19 | @property (nonatomic, assign) BOOL isAnimation; 20 | 21 | @end 22 | 23 | @implementation ScrollBarTagView 24 | @synthesize stayOffset = _stayOffset; 25 | 26 | #pragma mark - class method 27 | 28 | + (void)initWithScrollView:(UIScrollView *)scrollView withTagView:(UIView *)tagView didScroll:(ScrollBlock)scrollBlock { 29 | // lock repeat add ScrollBarTagView 30 | if (!objc_getAssociatedObject(scrollView, _cmd)) { 31 | // setup ScrollBarTagView 32 | ScrollBarTagView *scrollBarTagView = [ScrollBarTagView new]; 33 | scrollBarTagView.scrollView = scrollView; 34 | scrollBarTagView.scrollViewBarImgView = scrollView.subviews.lastObject; 35 | scrollBarTagView.scrollBlock = scrollBlock; 36 | scrollBarTagView.tagView = tagView; 37 | scrollBarTagView.tagView.hidden = YES; 38 | 39 | // setup tagView origin x 40 | CGRect newFrame = scrollBarTagView.tagView.frame; 41 | CGFloat tagViewX = CGRectGetWidth([UIScreen mainScreen].bounds) - CGRectGetWidth(scrollBarTagView.tagView.frame); 42 | newFrame.origin.x = tagViewX; 43 | scrollBarTagView.tagView.frame = newFrame; 44 | 45 | // addObserver 46 | [scrollBarTagView.scrollViewBarImgView addObserver:scrollBarTagView forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; 47 | [scrollBarTagView.scrollViewBarImgView addObserver:scrollBarTagView forKeyPath:@"alpha" options:NSKeyValueObservingOptionNew context:nil]; 48 | [scrollView.superview addSubview:scrollBarTagView.tagView]; 49 | 50 | // objc runtime 51 | objc_setAssociatedObject(scrollView, _cmd, scrollBarTagView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 52 | } 53 | } 54 | 55 | #pragma mark - private instance method 56 | 57 | #pragma mark * misc 58 | 59 | - (void)adjustPositionForScrollView { 60 | // convert scrollViewBarImgView point on scrollView superview 61 | CGPoint barImgViewConvertPoint = [self.scrollView convertPoint:self.scrollViewBarImgView.frame.origin toView:self.scrollView.superview]; 62 | 63 | // calculate tagView from scrollViewBarImgView 64 | CGFloat bothCenterY = (CGRectGetHeight(self.scrollViewBarImgView.frame) - CGRectGetHeight(self.tagView.frame)) / 2.0f; 65 | CGFloat tagViewY = barImgViewConvertPoint.y + bothCenterY; 66 | CGRect newFrame = self.tagView.frame; 67 | newFrame.origin.y = tagViewY; 68 | self.tagView.frame = newFrame; 69 | 70 | self.scrollBlock(self, self.tagView, CGRectGetMidY(self.scrollViewBarImgView.frame)); 71 | } 72 | 73 | - (CGRect)tagViewFrameToShow:(BOOL)isShow { 74 | CGRect newFrame = self.tagView.frame; 75 | CGFloat fixedSpace = CGRectGetWidth([UIScreen mainScreen].bounds) - CGRectGetWidth(self.tagView.frame); 76 | if (isShow) { 77 | newFrame.origin.x = fixedSpace - tagViewGap; 78 | } 79 | else { 80 | newFrame.origin.x = fixedSpace + tagViewGap; 81 | } 82 | return newFrame; 83 | } 84 | 85 | #pragma mark * animation 86 | 87 | - (void)showTagViewAnimation { 88 | if (self.tagView.hidden && !self.isAnimation && self.scrollViewBarImgView.alpha) { 89 | self.tagView.hidden = NO; 90 | self.isAnimation = YES; 91 | __weak typeof(self) weakSelf = self; 92 | [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations: ^{ 93 | weakSelf.tagView.frame = [weakSelf tagViewFrameToShow:YES]; 94 | weakSelf.tagView.alpha = 1.0f; 95 | } completion: ^(BOOL finished) { 96 | weakSelf.isAnimation = NO; 97 | }]; 98 | } 99 | } 100 | 101 | - (void)hiddenTagViewAnimation { 102 | if (!self.tagView.hidden && !self.isAnimation) { 103 | self.isStopHiddenAnimation = NO; 104 | self.isAnimation = YES; 105 | __weak typeof(self) weakSelf = self; 106 | [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations: ^{ 107 | weakSelf.tagView.frame = [weakSelf tagViewFrameToShow:NO]; 108 | weakSelf.tagView.alpha = 0.0f; 109 | } completion: ^(BOOL finished) { 110 | if (weakSelf.isStopHiddenAnimation) { 111 | // stop hidden animation 112 | weakSelf.tagView.frame = [weakSelf tagViewFrameToShow:YES]; 113 | weakSelf.tagView.hidden = NO; 114 | } 115 | else { 116 | // completion hidden animation 117 | weakSelf.tagView.hidden = YES; 118 | } 119 | weakSelf.isAnimation = NO; 120 | weakSelf.tagView.alpha = 1.0f; 121 | }]; 122 | } 123 | } 124 | 125 | #pragma mark - NSKeyValueObserving 126 | 127 | - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 128 | if ([keyPath isEqualToString:@"frame"]) { 129 | // observe scrollViewBarImgView frame (scrolling) 130 | [self adjustPositionForScrollView]; 131 | } 132 | else if ([keyPath isEqualToString:@"alpha"]) { 133 | // observe scrollViewBarImgView alpha 134 | UIImageView *scrollViewBarImgView = (UIImageView *)object; 135 | if (scrollViewBarImgView.alpha && !self.tagView.alpha) { 136 | self.isAnimation = NO; 137 | self.isStopHiddenAnimation = YES; 138 | [self.tagView.layer removeAllAnimations]; 139 | } 140 | else if (!scrollViewBarImgView.alpha) { 141 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hiddenTagViewAnimation) object:nil]; 142 | [self performSelector:@selector(hiddenTagViewAnimation) withObject:nil afterDelay:0.5f]; 143 | } 144 | } 145 | } 146 | 147 | #pragma mark - getter / setter 148 | 149 | - (void)setStayOffset:(CGFloat)stayOffset { 150 | _stayOffset = stayOffset; 151 | CGPoint centerPoint = CGPointMake(0.0f, stayOffset); 152 | CGPoint convertPoint = [self.scrollView convertPoint:centerPoint toView:self.scrollView.superview]; 153 | CGRect newFrame = self.tagView.frame; 154 | newFrame.origin.y = convertPoint.y; 155 | self.tagView.frame = newFrame; 156 | } 157 | 158 | - (CGFloat)stayOffset { 159 | return _stayOffset; 160 | } 161 | 162 | #pragma mark - life cycle 163 | 164 | - (void)dealloc { 165 | // removeObserver 166 | [self.scrollViewBarImgView removeObserver:self forKeyPath:@"frame"]; 167 | [self.scrollViewBarImgView removeObserver:self forKeyPath:@"alpha"]; 168 | } 169 | 170 | @end -------------------------------------------------------------------------------- /ScrollBarTagView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 7EB7BE371C0D414F007CB933 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE361C0D414F007CB933 /* main.m */; }; 11 | 7EB7BE3A1C0D414F007CB933 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE391C0D414F007CB933 /* AppDelegate.m */; }; 12 | 7EB7BE421C0D414F007CB933 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7BE411C0D414F007CB933 /* Assets.xcassets */; }; 13 | 7EB7BE451C0D414F007CB933 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7BE431C0D414F007CB933 /* LaunchScreen.storyboard */; }; 14 | 7EB7BE501C0D414F007CB933 /* ScrollBarTagViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE4F1C0D414F007CB933 /* ScrollBarTagViewTests.m */; }; 15 | 7EB7BE5B1C0D414F007CB933 /* ScrollBarTagViewUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE5A1C0D414F007CB933 /* ScrollBarTagViewUITests.m */; }; 16 | 7EB7BE691C0D41AC007CB933 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7BE681C0D41AC007CB933 /* Default-568h@2x.png */; }; 17 | 7EB7BE7B1C0D4251007CB933 /* ScrollBarTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE771C0D4251007CB933 /* ScrollBarTagView.m */; }; 18 | 7EB7BE881C0D4387007CB933 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE861C0D4387007CB933 /* ViewController.m */; }; 19 | 7EB7BE891C0D4387007CB933 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7BE871C0D4387007CB933 /* ViewController.xib */; }; 20 | 7EB7BE8E1C0D43D7007CB933 /* TagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB7BE8C1C0D43D7007CB933 /* TagView.m */; }; 21 | 7EB7BE8F1C0D43D7007CB933 /* TagView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7EB7BE8D1C0D43D7007CB933 /* TagView.xib */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | 7EB7BE4C1C0D414F007CB933 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = 7EB7BE2A1C0D414F007CB933 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = 7EB7BE311C0D414F007CB933; 30 | remoteInfo = ScrollBarTagView; 31 | }; 32 | 7EB7BE571C0D414F007CB933 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 7EB7BE2A1C0D414F007CB933 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 7EB7BE311C0D414F007CB933; 37 | remoteInfo = ScrollBarTagView; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 7EB7BE321C0D414F007CB933 /* ScrollBarTagView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollBarTagView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 7EB7BE361C0D414F007CB933 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 44 | 7EB7BE381C0D414F007CB933 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 45 | 7EB7BE391C0D414F007CB933 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 46 | 7EB7BE411C0D414F007CB933 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | 7EB7BE441C0D414F007CB933 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 7EB7BE461C0D414F007CB933 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | 7EB7BE4B1C0D414F007CB933 /* ScrollBarTagViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScrollBarTagViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | 7EB7BE4F1C0D414F007CB933 /* ScrollBarTagViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScrollBarTagViewTests.m; sourceTree = ""; }; 51 | 7EB7BE511C0D414F007CB933 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | 7EB7BE561C0D414F007CB933 /* ScrollBarTagViewUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScrollBarTagViewUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | 7EB7BE5A1C0D414F007CB933 /* ScrollBarTagViewUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScrollBarTagViewUITests.m; sourceTree = ""; }; 54 | 7EB7BE5C1C0D414F007CB933 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | 7EB7BE681C0D41AC007CB933 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 56 | 7EB7BE761C0D4251007CB933 /* ScrollBarTagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollBarTagView.h; sourceTree = ""; }; 57 | 7EB7BE771C0D4251007CB933 /* ScrollBarTagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollBarTagView.m; sourceTree = ""; }; 58 | 7EB7BE851C0D4387007CB933 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 59 | 7EB7BE861C0D4387007CB933 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 60 | 7EB7BE871C0D4387007CB933 /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; 61 | 7EB7BE8B1C0D43D7007CB933 /* TagView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TagView.h; sourceTree = ""; }; 62 | 7EB7BE8C1C0D43D7007CB933 /* TagView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TagView.m; sourceTree = ""; }; 63 | 7EB7BE8D1C0D43D7007CB933 /* TagView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TagView.xib; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | 7EB7BE2F1C0D414F007CB933 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | 7EB7BE481C0D414F007CB933 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | 7EB7BE531C0D414F007CB933 /* Frameworks */ = { 82 | isa = PBXFrameworksBuildPhase; 83 | buildActionMask = 2147483647; 84 | files = ( 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | /* End PBXFrameworksBuildPhase section */ 89 | 90 | /* Begin PBXGroup section */ 91 | 7EB7BE291C0D414F007CB933 = { 92 | isa = PBXGroup; 93 | children = ( 94 | 7EB7BE341C0D414F007CB933 /* ScrollBarTagView */, 95 | 7EB7BE4E1C0D414F007CB933 /* ScrollBarTagViewTests */, 96 | 7EB7BE591C0D414F007CB933 /* ScrollBarTagViewUITests */, 97 | 7EB7BE331C0D414F007CB933 /* Products */, 98 | ); 99 | sourceTree = ""; 100 | }; 101 | 7EB7BE331C0D414F007CB933 /* Products */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 7EB7BE321C0D414F007CB933 /* ScrollBarTagView.app */, 105 | 7EB7BE4B1C0D414F007CB933 /* ScrollBarTagViewTests.xctest */, 106 | 7EB7BE561C0D414F007CB933 /* ScrollBarTagViewUITests.xctest */, 107 | ); 108 | name = Products; 109 | sourceTree = ""; 110 | }; 111 | 7EB7BE341C0D414F007CB933 /* ScrollBarTagView */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 7EB7BE751C0D4251007CB933 /* ScrollBarTagView */, 115 | 7EB7BE8A1C0D43D7007CB933 /* TagView */, 116 | 7EB7BE381C0D414F007CB933 /* AppDelegate.h */, 117 | 7EB7BE391C0D414F007CB933 /* AppDelegate.m */, 118 | 7EB7BE841C0D4387007CB933 /* ViewController */, 119 | 7EB7BE411C0D414F007CB933 /* Assets.xcassets */, 120 | 7EB7BE351C0D414F007CB933 /* Supporting Files */, 121 | ); 122 | path = ScrollBarTagView; 123 | sourceTree = ""; 124 | }; 125 | 7EB7BE351C0D414F007CB933 /* Supporting Files */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 7EB7BE431C0D414F007CB933 /* LaunchScreen.storyboard */, 129 | 7EB7BE461C0D414F007CB933 /* Info.plist */, 130 | 7EB7BE681C0D41AC007CB933 /* Default-568h@2x.png */, 131 | 7EB7BE361C0D414F007CB933 /* main.m */, 132 | ); 133 | name = "Supporting Files"; 134 | sourceTree = ""; 135 | }; 136 | 7EB7BE4E1C0D414F007CB933 /* ScrollBarTagViewTests */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 7EB7BE4F1C0D414F007CB933 /* ScrollBarTagViewTests.m */, 140 | 7EB7BE511C0D414F007CB933 /* Info.plist */, 141 | ); 142 | path = ScrollBarTagViewTests; 143 | sourceTree = ""; 144 | }; 145 | 7EB7BE591C0D414F007CB933 /* ScrollBarTagViewUITests */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 7EB7BE5A1C0D414F007CB933 /* ScrollBarTagViewUITests.m */, 149 | 7EB7BE5C1C0D414F007CB933 /* Info.plist */, 150 | ); 151 | path = ScrollBarTagViewUITests; 152 | sourceTree = ""; 153 | }; 154 | 7EB7BE751C0D4251007CB933 /* ScrollBarTagView */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 7EB7BE761C0D4251007CB933 /* ScrollBarTagView.h */, 158 | 7EB7BE771C0D4251007CB933 /* ScrollBarTagView.m */, 159 | ); 160 | path = ScrollBarTagView; 161 | sourceTree = ""; 162 | }; 163 | 7EB7BE841C0D4387007CB933 /* ViewController */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 7EB7BE851C0D4387007CB933 /* ViewController.h */, 167 | 7EB7BE861C0D4387007CB933 /* ViewController.m */, 168 | 7EB7BE871C0D4387007CB933 /* ViewController.xib */, 169 | ); 170 | path = ViewController; 171 | sourceTree = ""; 172 | }; 173 | 7EB7BE8A1C0D43D7007CB933 /* TagView */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 7EB7BE8B1C0D43D7007CB933 /* TagView.h */, 177 | 7EB7BE8C1C0D43D7007CB933 /* TagView.m */, 178 | 7EB7BE8D1C0D43D7007CB933 /* TagView.xib */, 179 | ); 180 | path = TagView; 181 | sourceTree = ""; 182 | }; 183 | /* End PBXGroup section */ 184 | 185 | /* Begin PBXNativeTarget section */ 186 | 7EB7BE311C0D414F007CB933 /* ScrollBarTagView */ = { 187 | isa = PBXNativeTarget; 188 | buildConfigurationList = 7EB7BE5F1C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagView" */; 189 | buildPhases = ( 190 | 7EB7BE2E1C0D414F007CB933 /* Sources */, 191 | 7EB7BE2F1C0D414F007CB933 /* Frameworks */, 192 | 7EB7BE301C0D414F007CB933 /* Resources */, 193 | ); 194 | buildRules = ( 195 | ); 196 | dependencies = ( 197 | ); 198 | name = ScrollBarTagView; 199 | productName = ScrollBarTagView; 200 | productReference = 7EB7BE321C0D414F007CB933 /* ScrollBarTagView.app */; 201 | productType = "com.apple.product-type.application"; 202 | }; 203 | 7EB7BE4A1C0D414F007CB933 /* ScrollBarTagViewTests */ = { 204 | isa = PBXNativeTarget; 205 | buildConfigurationList = 7EB7BE621C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagViewTests" */; 206 | buildPhases = ( 207 | 7EB7BE471C0D414F007CB933 /* Sources */, 208 | 7EB7BE481C0D414F007CB933 /* Frameworks */, 209 | 7EB7BE491C0D414F007CB933 /* Resources */, 210 | ); 211 | buildRules = ( 212 | ); 213 | dependencies = ( 214 | 7EB7BE4D1C0D414F007CB933 /* PBXTargetDependency */, 215 | ); 216 | name = ScrollBarTagViewTests; 217 | productName = ScrollBarTagViewTests; 218 | productReference = 7EB7BE4B1C0D414F007CB933 /* ScrollBarTagViewTests.xctest */; 219 | productType = "com.apple.product-type.bundle.unit-test"; 220 | }; 221 | 7EB7BE551C0D414F007CB933 /* ScrollBarTagViewUITests */ = { 222 | isa = PBXNativeTarget; 223 | buildConfigurationList = 7EB7BE651C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagViewUITests" */; 224 | buildPhases = ( 225 | 7EB7BE521C0D414F007CB933 /* Sources */, 226 | 7EB7BE531C0D414F007CB933 /* Frameworks */, 227 | 7EB7BE541C0D414F007CB933 /* Resources */, 228 | ); 229 | buildRules = ( 230 | ); 231 | dependencies = ( 232 | 7EB7BE581C0D414F007CB933 /* PBXTargetDependency */, 233 | ); 234 | name = ScrollBarTagViewUITests; 235 | productName = ScrollBarTagViewUITests; 236 | productReference = 7EB7BE561C0D414F007CB933 /* ScrollBarTagViewUITests.xctest */; 237 | productType = "com.apple.product-type.bundle.ui-testing"; 238 | }; 239 | /* End PBXNativeTarget section */ 240 | 241 | /* Begin PBXProject section */ 242 | 7EB7BE2A1C0D414F007CB933 /* Project object */ = { 243 | isa = PBXProject; 244 | attributes = { 245 | LastUpgradeCheck = 0710; 246 | ORGANIZATIONNAME = dse12345z; 247 | TargetAttributes = { 248 | 7EB7BE311C0D414F007CB933 = { 249 | CreatedOnToolsVersion = 7.1.1; 250 | }; 251 | 7EB7BE4A1C0D414F007CB933 = { 252 | CreatedOnToolsVersion = 7.1.1; 253 | TestTargetID = 7EB7BE311C0D414F007CB933; 254 | }; 255 | 7EB7BE551C0D414F007CB933 = { 256 | CreatedOnToolsVersion = 7.1.1; 257 | TestTargetID = 7EB7BE311C0D414F007CB933; 258 | }; 259 | }; 260 | }; 261 | buildConfigurationList = 7EB7BE2D1C0D414F007CB933 /* Build configuration list for PBXProject "ScrollBarTagView" */; 262 | compatibilityVersion = "Xcode 3.2"; 263 | developmentRegion = English; 264 | hasScannedForEncodings = 0; 265 | knownRegions = ( 266 | en, 267 | Base, 268 | ); 269 | mainGroup = 7EB7BE291C0D414F007CB933; 270 | productRefGroup = 7EB7BE331C0D414F007CB933 /* Products */; 271 | projectDirPath = ""; 272 | projectRoot = ""; 273 | targets = ( 274 | 7EB7BE311C0D414F007CB933 /* ScrollBarTagView */, 275 | 7EB7BE4A1C0D414F007CB933 /* ScrollBarTagViewTests */, 276 | 7EB7BE551C0D414F007CB933 /* ScrollBarTagViewUITests */, 277 | ); 278 | }; 279 | /* End PBXProject section */ 280 | 281 | /* Begin PBXResourcesBuildPhase section */ 282 | 7EB7BE301C0D414F007CB933 /* Resources */ = { 283 | isa = PBXResourcesBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | 7EB7BE451C0D414F007CB933 /* LaunchScreen.storyboard in Resources */, 287 | 7EB7BE8F1C0D43D7007CB933 /* TagView.xib in Resources */, 288 | 7EB7BE421C0D414F007CB933 /* Assets.xcassets in Resources */, 289 | 7EB7BE891C0D4387007CB933 /* ViewController.xib in Resources */, 290 | 7EB7BE691C0D41AC007CB933 /* Default-568h@2x.png in Resources */, 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | 7EB7BE491C0D414F007CB933 /* Resources */ = { 295 | isa = PBXResourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | }; 301 | 7EB7BE541C0D414F007CB933 /* Resources */ = { 302 | isa = PBXResourcesBuildPhase; 303 | buildActionMask = 2147483647; 304 | files = ( 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | }; 308 | /* End PBXResourcesBuildPhase section */ 309 | 310 | /* Begin PBXSourcesBuildPhase section */ 311 | 7EB7BE2E1C0D414F007CB933 /* Sources */ = { 312 | isa = PBXSourcesBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | 7EB7BE881C0D4387007CB933 /* ViewController.m in Sources */, 316 | 7EB7BE8E1C0D43D7007CB933 /* TagView.m in Sources */, 317 | 7EB7BE7B1C0D4251007CB933 /* ScrollBarTagView.m in Sources */, 318 | 7EB7BE3A1C0D414F007CB933 /* AppDelegate.m in Sources */, 319 | 7EB7BE371C0D414F007CB933 /* main.m in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | 7EB7BE471C0D414F007CB933 /* Sources */ = { 324 | isa = PBXSourcesBuildPhase; 325 | buildActionMask = 2147483647; 326 | files = ( 327 | 7EB7BE501C0D414F007CB933 /* ScrollBarTagViewTests.m in Sources */, 328 | ); 329 | runOnlyForDeploymentPostprocessing = 0; 330 | }; 331 | 7EB7BE521C0D414F007CB933 /* Sources */ = { 332 | isa = PBXSourcesBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | 7EB7BE5B1C0D414F007CB933 /* ScrollBarTagViewUITests.m in Sources */, 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | }; 339 | /* End PBXSourcesBuildPhase section */ 340 | 341 | /* Begin PBXTargetDependency section */ 342 | 7EB7BE4D1C0D414F007CB933 /* PBXTargetDependency */ = { 343 | isa = PBXTargetDependency; 344 | target = 7EB7BE311C0D414F007CB933 /* ScrollBarTagView */; 345 | targetProxy = 7EB7BE4C1C0D414F007CB933 /* PBXContainerItemProxy */; 346 | }; 347 | 7EB7BE581C0D414F007CB933 /* PBXTargetDependency */ = { 348 | isa = PBXTargetDependency; 349 | target = 7EB7BE311C0D414F007CB933 /* ScrollBarTagView */; 350 | targetProxy = 7EB7BE571C0D414F007CB933 /* PBXContainerItemProxy */; 351 | }; 352 | /* End PBXTargetDependency section */ 353 | 354 | /* Begin PBXVariantGroup section */ 355 | 7EB7BE431C0D414F007CB933 /* LaunchScreen.storyboard */ = { 356 | isa = PBXVariantGroup; 357 | children = ( 358 | 7EB7BE441C0D414F007CB933 /* Base */, 359 | ); 360 | name = LaunchScreen.storyboard; 361 | sourceTree = ""; 362 | }; 363 | /* End PBXVariantGroup section */ 364 | 365 | /* Begin XCBuildConfiguration section */ 366 | 7EB7BE5D1C0D414F007CB933 /* Debug */ = { 367 | isa = XCBuildConfiguration; 368 | buildSettings = { 369 | ALWAYS_SEARCH_USER_PATHS = NO; 370 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 371 | CLANG_CXX_LIBRARY = "libc++"; 372 | CLANG_ENABLE_MODULES = YES; 373 | CLANG_ENABLE_OBJC_ARC = YES; 374 | CLANG_WARN_BOOL_CONVERSION = YES; 375 | CLANG_WARN_CONSTANT_CONVERSION = YES; 376 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 377 | CLANG_WARN_EMPTY_BODY = YES; 378 | CLANG_WARN_ENUM_CONVERSION = YES; 379 | CLANG_WARN_INT_CONVERSION = YES; 380 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 381 | CLANG_WARN_UNREACHABLE_CODE = YES; 382 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 383 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 384 | COPY_PHASE_STRIP = NO; 385 | DEBUG_INFORMATION_FORMAT = dwarf; 386 | ENABLE_STRICT_OBJC_MSGSEND = YES; 387 | ENABLE_TESTABILITY = YES; 388 | GCC_C_LANGUAGE_STANDARD = gnu99; 389 | GCC_DYNAMIC_NO_PIC = NO; 390 | GCC_NO_COMMON_BLOCKS = YES; 391 | GCC_OPTIMIZATION_LEVEL = 0; 392 | GCC_PREPROCESSOR_DEFINITIONS = ( 393 | "DEBUG=1", 394 | "$(inherited)", 395 | ); 396 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 397 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 398 | GCC_WARN_UNDECLARED_SELECTOR = YES; 399 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 400 | GCC_WARN_UNUSED_FUNCTION = YES; 401 | GCC_WARN_UNUSED_VARIABLE = YES; 402 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 403 | MTL_ENABLE_DEBUG_INFO = YES; 404 | ONLY_ACTIVE_ARCH = YES; 405 | SDKROOT = iphoneos; 406 | }; 407 | name = Debug; 408 | }; 409 | 7EB7BE5E1C0D414F007CB933 /* Release */ = { 410 | isa = XCBuildConfiguration; 411 | buildSettings = { 412 | ALWAYS_SEARCH_USER_PATHS = NO; 413 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 414 | CLANG_CXX_LIBRARY = "libc++"; 415 | CLANG_ENABLE_MODULES = YES; 416 | CLANG_ENABLE_OBJC_ARC = YES; 417 | CLANG_WARN_BOOL_CONVERSION = YES; 418 | CLANG_WARN_CONSTANT_CONVERSION = YES; 419 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 420 | CLANG_WARN_EMPTY_BODY = YES; 421 | CLANG_WARN_ENUM_CONVERSION = YES; 422 | CLANG_WARN_INT_CONVERSION = YES; 423 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 424 | CLANG_WARN_UNREACHABLE_CODE = YES; 425 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 426 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 427 | COPY_PHASE_STRIP = NO; 428 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 429 | ENABLE_NS_ASSERTIONS = NO; 430 | ENABLE_STRICT_OBJC_MSGSEND = YES; 431 | GCC_C_LANGUAGE_STANDARD = gnu99; 432 | GCC_NO_COMMON_BLOCKS = YES; 433 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 434 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 435 | GCC_WARN_UNDECLARED_SELECTOR = YES; 436 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 437 | GCC_WARN_UNUSED_FUNCTION = YES; 438 | GCC_WARN_UNUSED_VARIABLE = YES; 439 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 440 | MTL_ENABLE_DEBUG_INFO = NO; 441 | SDKROOT = iphoneos; 442 | VALIDATE_PRODUCT = YES; 443 | }; 444 | name = Release; 445 | }; 446 | 7EB7BE601C0D414F007CB933 /* Debug */ = { 447 | isa = XCBuildConfiguration; 448 | buildSettings = { 449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 450 | INFOPLIST_FILE = ScrollBarTagView/Info.plist; 451 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 452 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagView; 453 | PRODUCT_NAME = "$(TARGET_NAME)"; 454 | }; 455 | name = Debug; 456 | }; 457 | 7EB7BE611C0D414F007CB933 /* Release */ = { 458 | isa = XCBuildConfiguration; 459 | buildSettings = { 460 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 461 | INFOPLIST_FILE = ScrollBarTagView/Info.plist; 462 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 463 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagView; 464 | PRODUCT_NAME = "$(TARGET_NAME)"; 465 | }; 466 | name = Release; 467 | }; 468 | 7EB7BE631C0D414F007CB933 /* Debug */ = { 469 | isa = XCBuildConfiguration; 470 | buildSettings = { 471 | BUNDLE_LOADER = "$(TEST_HOST)"; 472 | INFOPLIST_FILE = ScrollBarTagViewTests/Info.plist; 473 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 474 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagViewTests; 475 | PRODUCT_NAME = "$(TARGET_NAME)"; 476 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollBarTagView.app/ScrollBarTagView"; 477 | }; 478 | name = Debug; 479 | }; 480 | 7EB7BE641C0D414F007CB933 /* Release */ = { 481 | isa = XCBuildConfiguration; 482 | buildSettings = { 483 | BUNDLE_LOADER = "$(TEST_HOST)"; 484 | INFOPLIST_FILE = ScrollBarTagViewTests/Info.plist; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 486 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagViewTests; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollBarTagView.app/ScrollBarTagView"; 489 | }; 490 | name = Release; 491 | }; 492 | 7EB7BE661C0D414F007CB933 /* Debug */ = { 493 | isa = XCBuildConfiguration; 494 | buildSettings = { 495 | INFOPLIST_FILE = ScrollBarTagViewUITests/Info.plist; 496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 497 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagViewUITests; 498 | PRODUCT_NAME = "$(TARGET_NAME)"; 499 | TEST_TARGET_NAME = ScrollBarTagView; 500 | USES_XCTRUNNER = YES; 501 | }; 502 | name = Debug; 503 | }; 504 | 7EB7BE671C0D414F007CB933 /* Release */ = { 505 | isa = XCBuildConfiguration; 506 | buildSettings = { 507 | INFOPLIST_FILE = ScrollBarTagViewUITests/Info.plist; 508 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 509 | PRODUCT_BUNDLE_IDENTIFIER = tw.tyche.ScrollBarTagViewUITests; 510 | PRODUCT_NAME = "$(TARGET_NAME)"; 511 | TEST_TARGET_NAME = ScrollBarTagView; 512 | USES_XCTRUNNER = YES; 513 | }; 514 | name = Release; 515 | }; 516 | /* End XCBuildConfiguration section */ 517 | 518 | /* Begin XCConfigurationList section */ 519 | 7EB7BE2D1C0D414F007CB933 /* Build configuration list for PBXProject "ScrollBarTagView" */ = { 520 | isa = XCConfigurationList; 521 | buildConfigurations = ( 522 | 7EB7BE5D1C0D414F007CB933 /* Debug */, 523 | 7EB7BE5E1C0D414F007CB933 /* Release */, 524 | ); 525 | defaultConfigurationIsVisible = 0; 526 | defaultConfigurationName = Release; 527 | }; 528 | 7EB7BE5F1C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagView" */ = { 529 | isa = XCConfigurationList; 530 | buildConfigurations = ( 531 | 7EB7BE601C0D414F007CB933 /* Debug */, 532 | 7EB7BE611C0D414F007CB933 /* Release */, 533 | ); 534 | defaultConfigurationIsVisible = 0; 535 | defaultConfigurationName = Release; 536 | }; 537 | 7EB7BE621C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagViewTests" */ = { 538 | isa = XCConfigurationList; 539 | buildConfigurations = ( 540 | 7EB7BE631C0D414F007CB933 /* Debug */, 541 | 7EB7BE641C0D414F007CB933 /* Release */, 542 | ); 543 | defaultConfigurationIsVisible = 0; 544 | defaultConfigurationName = Release; 545 | }; 546 | 7EB7BE651C0D414F007CB933 /* Build configuration list for PBXNativeTarget "ScrollBarTagViewUITests" */ = { 547 | isa = XCConfigurationList; 548 | buildConfigurations = ( 549 | 7EB7BE661C0D414F007CB933 /* Debug */, 550 | 7EB7BE671C0D414F007CB933 /* Release */, 551 | ); 552 | defaultConfigurationIsVisible = 0; 553 | defaultConfigurationName = Release; 554 | }; 555 | /* End XCConfigurationList section */ 556 | }; 557 | rootObject = 7EB7BE2A1C0D414F007CB933 /* Project object */; 558 | } 559 | --------------------------------------------------------------------------------