├── RMTableViewCellDemoAnimation.gif ├── RMSwipeTableViewCellDemo ├── RMSwipeTableViewCellDemo │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── RMSwipeTableViewCellDemoAppDelegate.h │ ├── RMSwipeTableViewCellDemo-Prefix.pch │ ├── RMSwipeTableViewController.h │ ├── main.m │ ├── RMPersonTableViewCell.h │ ├── RMSwipeTableViewCellDemo-Info.plist │ ├── RMSwipeTableViewCellDemoAppDelegate.m │ ├── Launch Screen.storyboard │ ├── RMSwipeTableViewController.m │ └── RMPersonTableViewCell.m ├── Assets.xcassets │ ├── Contents.json │ ├── jaime.imageset │ │ ├── jaime.png │ │ ├── jaime@2x.png │ │ └── Contents.json │ ├── tywin.imageset │ │ ├── tywin.png │ │ ├── tywin@2x.png │ │ └── Contents.json │ ├── cersei.imageset │ │ ├── cersei.png │ │ ├── cersei@2x.png │ │ └── Contents.json │ ├── tyrion.imageset │ │ ├── tyrion.png │ │ ├── tyrion@2x.png │ │ └── Contents.json │ ├── joffrey.imageset │ │ ├── joffrey.png │ │ ├── joffrey@2x.png │ │ └── Contents.json │ ├── DeleteGrey.imageset │ │ ├── DeleteGrey.png │ │ ├── DeleteGrey@2x.png │ │ └── Contents.json │ ├── DeleteRed.imageset │ │ ├── DeleteRed.png │ │ ├── DeleteRed@2x.png │ │ └── Contents.json │ ├── CheckmarkGrey.imageset │ │ ├── CheckmarkGrey.png │ │ ├── CheckmarkGrey@2x.png │ │ └── Contents.json │ ├── CheckmarkGreen.imageset │ │ ├── CheckmarkGreen.png │ │ ├── CheckmarkGreen@2x.png │ │ └── Contents.json │ ├── HouseStarkSigil.imageset │ │ ├── HouseStarkSigil.png │ │ ├── HouseStarkSigil@2x.png │ │ └── Contents.json │ ├── CheckmarkProfileImage.imageset │ │ ├── CheckmarkProfileImage.png │ │ ├── CheckmarkProfileImage@2x.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json └── RMSwipeTableViewCellDemo.xcodeproj │ └── project.pbxproj ├── RMSwipeTableViewCellDemoScreenshot.png ├── RMSwipeTableViewCelliOS7UIDemo ├── RMSwipeTableViewCelliOS7UIDemo │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── Default.png │ ├── Default@2x.png │ ├── Default-568h@2x.png │ ├── DeleteButtonBackground.png │ ├── RMAppDelegate.h │ ├── main.m │ ├── RMSwipeTableViewCelliOS7UIDemo-Prefix.pch │ ├── RMSwipeTableViewCelliOS7UIDemoViewController.h │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── RMSwipeTableViewCelliOS7UIDemoTableViewCell.h │ ├── RMSwipeTableViewCelliOS7UIDemo-Info.plist │ ├── RMAppDelegate.m │ ├── RMSwipeTableViewCelliOS7UIDemoTableViewCell.m │ ├── RMSwipeTableViewCelliOS7UIDemoViewController.m │ └── View.xib └── RMSwipeTableViewCelliOS7UIDemo.xcodeproj │ └── project.pbxproj ├── RMSwipeTableViewCelliOS7DemoAnimation.gif ├── .gitignore ├── RMSwipeTableViewCell.podspec ├── LICENSE ├── RMSwipeTableViewCell.h ├── README.md └── RMSwipeTableViewCell.m /RMTableViewCellDemoAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMTableViewCellDemoAnimation.gif -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemoScreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemoScreenshot.png -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7DemoAnimation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCelliOS7DemoAnimation.gif -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/jaime.imageset/jaime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/jaime.imageset/jaime.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tywin.imageset/tywin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/tywin.imageset/tywin.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/cersei.imageset/cersei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/cersei.imageset/cersei.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tyrion.imageset/tyrion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/tyrion.imageset/tyrion.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/cersei.imageset/cersei@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/cersei.imageset/cersei@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/jaime.imageset/jaime@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/jaime.imageset/jaime@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/joffrey.imageset/joffrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/joffrey.imageset/joffrey.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tyrion.imageset/tyrion@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/tyrion.imageset/tyrion@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tywin.imageset/tywin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/tywin.imageset/tywin@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/joffrey.imageset/joffrey@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/joffrey.imageset/joffrey@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteGrey.imageset/DeleteGrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/DeleteGrey.imageset/DeleteGrey.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteRed.imageset/DeleteRed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/DeleteRed.imageset/DeleteRed.png -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteRed.imageset/DeleteRed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/DeleteRed.imageset/DeleteRed@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteGrey.imageset/DeleteGrey@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/DeleteGrey.imageset/DeleteGrey@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGrey.imageset/CheckmarkGrey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGrey.imageset/CheckmarkGrey.png -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Default-568h@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGreen.imageset/CheckmarkGreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGreen.imageset/CheckmarkGreen.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGrey.imageset/CheckmarkGrey@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGrey.imageset/CheckmarkGrey@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/HouseStarkSigil.imageset/HouseStarkSigil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/HouseStarkSigil.imageset/HouseStarkSigil.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGreen.imageset/CheckmarkGreen@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGreen.imageset/CheckmarkGreen@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/HouseStarkSigil.imageset/HouseStarkSigil@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/HouseStarkSigil.imageset/HouseStarkSigil@2x.png -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/DeleteButtonBackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/DeleteButtonBackground.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkProfileImage.imageset/CheckmarkProfileImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkProfileImage.imageset/CheckmarkProfileImage.png -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkProfileImage.imageset/CheckmarkProfileImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runmad/RMSwipeTableViewCell/HEAD/RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkProfileImage.imageset/CheckmarkProfileImage@2x.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | *UserInterfaceState.xcuserstate 20 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMAppDelegate.h 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RMAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemoAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMAppDelegate.h 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | @interface RMSwipeTableViewCellDemoAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'RMSwipeTableView' target in the 'RMSwipeTableView' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_3_0 8 | #warning "This project uses features only available in iOS SDK 3.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/jaime.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "jaime.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "jaime@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tywin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tywin.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "tywin@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/cersei.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cersei.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cersei@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/joffrey.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "joffrey.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "joffrey@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/tyrion.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tyrion.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "tyrion@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteGrey.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "DeleteGrey.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "DeleteGrey@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/DeleteRed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "DeleteRed.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "DeleteRed@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewController.h 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | #import "RMPersonTableViewCell.h" 11 | 12 | @interface RMSwipeTableViewController : UITableViewController 13 | 14 | @property (nonatomic, strong) NSMutableArray *array; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "RMAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([RMAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGrey.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "CheckmarkGrey.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "CheckmarkGrey@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'RMSwipeTableViewCelliOS7UIDemo' target in the 'RMSwipeTableViewCelliOS7UIDemo' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_3_0 8 | #warning "This project uses features only available in iOS SDK 3.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkGreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "CheckmarkGreen.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "CheckmarkGreen@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/HouseStarkSigil.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "HouseStarkSigil.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "HouseStarkSigil@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | #import "RMSwipeTableViewCellDemoAppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([RMSwipeTableViewCellDemoAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/Assets.xcassets/CheckmarkProfileImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "CheckmarkProfileImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "CheckmarkProfileImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCell.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'RMSwipeTableViewCell' 3 | s.version = ‘0.6.1’ 4 | s.summary = 'A drop-in UITableViewCell subclass with built-in pan/swipe gestures for easy integration into any project.' 5 | s.homepage = 'https://github.com/runmad/RMSwipeTableViewCell' 6 | s.author = { 'Rune Madsen' => 'runemadsen@mac.com' } 7 | s.license = { :type => 'MIT', :file => 'LICENSE' } 8 | s.source = { 9 | :git => 'https://github.com/runmad/RMSwipeTableViewCell.git', 10 | :tag => s.version.to_s 11 | } 12 | s.platform = :ios, '5.0' 13 | s.source_files = '*.{h,m}' 14 | s.requires_arc = true 15 | end 16 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCelliOS7UIDemoViewController.h 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "RMSwipeTableViewCelliOS7UIDemoTableViewCell.h" 11 | 12 | @interface RMSwipeTableViewCelliOS7UIDemoViewController : UITableViewController 13 | 14 | @property (nonatomic, strong) NSMutableArray *messagesArray; 15 | @property (nonatomic, strong) NSIndexPath *selectedIndexPath; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/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 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "1x", 6 | "size" : "57x57" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "2x", 11 | "size" : "57x57" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "60x60" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "1x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "29x29" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMPersonTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMPersonTableViewCell.h 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2013-05-13. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCell.h" 10 | 11 | @interface RMPersonTableViewCell : RMSwipeTableViewCell 12 | 13 | @property (nonatomic, strong) UIImageView *profileImageView; 14 | @property (nonatomic, strong) UIImageView *checkmarkGreyImageView; 15 | @property (nonatomic, strong) UIImageView *checkmarkGreenImageView; 16 | @property (nonatomic, strong) UIImageView *checkmarkProfileImageView; 17 | @property (nonatomic, strong) UIImageView *deleteGreyImageView; 18 | @property (nonatomic, strong) UIImageView *deleteRedImageView; 19 | @property (nonatomic, assign) BOOL isFavourite; 20 | 21 | -(void)setThumbnail:(UIImage*)image; 22 | -(void)setFavourite:(BOOL)favourite animated:(BOOL)animated; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemoTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCelliOS7UIDemoTableViewCell.h 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCell.h" 10 | 11 | @protocol RMSwipeTableViewCelliOS7UIDemoTableViewCellDelegate; 12 | 13 | @interface RMSwipeTableViewCelliOS7UIDemoTableViewCell : RMSwipeTableViewCell 14 | 15 | typedef void (^deleteBlock)(RMSwipeTableViewCelliOS7UIDemoTableViewCell *swipeTableViewCell); 16 | 17 | @property (nonatomic, strong) UIButton *deleteButton; 18 | @property (nonatomic, strong) deleteBlock deleteBlockHandler; 19 | @property (nonatomic, assign) id demoDelegate; 20 | 21 | -(void)resetContentView; 22 | 23 | @end 24 | 25 | @protocol RMSwipeTableViewCelliOS7UIDemoTableViewCellDelegate 26 | @optional 27 | -(void)swipeTableViewCellDidDelete:(RMSwipeTableViewCelliOS7UIDemoTableViewCell*)swipeTableViewCell; 28 | @end 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Rune Madsen (http://www.runmad.com/) and The App Boutique (http://www.theappboutique.com/) 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 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIcons 12 | 13 | CFBundleIcons~ipad 14 | 15 | CFBundleIdentifier 16 | theappboutique.${PRODUCT_NAME:rfc1034identifier} 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | ${PRODUCT_NAME} 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | 1.0 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | 1.0 29 | LSRequiresIPhoneOS 30 | 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-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 | Launch Screen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UIStatusBarHidden 34 | 35 | UIStatusBarStyle 36 | UIStatusBarStyleLightContent 37 | UISupportedInterfaceOrientations 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationLandscapeLeft 41 | UIInterfaceOrientationLandscapeRight 42 | 43 | UIViewControllerBasedStatusBarAppearance 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMAppDelegate.m 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMAppDelegate.h" 10 | #import "RMSwipeTableViewCelliOS7UIDemoViewController.h" 11 | 12 | @implementation RMAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 17 | self.window.backgroundColor = [UIColor whiteColor]; 18 | [self.window makeKeyAndVisible]; 19 | 20 | RMSwipeTableViewCelliOS7UIDemoViewController *swipeTableViewCelliOS7UIDemoViewController = [[RMSwipeTableViewCelliOS7UIDemoViewController alloc] initWithStyle:UITableViewStylePlain]; 21 | UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:swipeTableViewCelliOS7UIDemoViewController]; 22 | self.window.rootViewController = navigationController; 23 | 24 | return YES; 25 | } 26 | 27 | - (void)applicationWillResignActive:(UIApplication *)application 28 | { 29 | // 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. 30 | // 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. 31 | } 32 | 33 | - (void)applicationDidEnterBackground:(UIApplication *)application 34 | { 35 | // 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. 36 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 37 | } 38 | 39 | - (void)applicationWillEnterForeground:(UIApplication *)application 40 | { 41 | // 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. 42 | } 43 | 44 | - (void)applicationDidBecomeActive:(UIApplication *)application 45 | { 46 | // 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. 47 | } 48 | 49 | - (void)applicationWillTerminate:(UIApplication *)application 50 | { 51 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemoAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMAppDelegate.m 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCellDemoAppDelegate.h" 10 | #import "RMSwipeTableViewController.h" 11 | 12 | @implementation RMSwipeTableViewCellDemoAppDelegate 13 | 14 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 15 | { 16 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 17 | 18 | RMSwipeTableViewController *swipeTableViewController = [[RMSwipeTableViewController alloc] initWithStyle:UITableViewStylePlain]; 19 | self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:swipeTableViewController]; 20 | self.window.backgroundColor = [UIColor whiteColor]; 21 | self.window.tintColor = [UIColor whiteColor]; 22 | [self.window makeKeyAndVisible]; 23 | 24 | [[UINavigationBar appearance] setBarTintColor:[UIColor colorWithRed:1.000 green:0.136 blue:0.142 alpha:1.000]]; 25 | 26 | [[UINavigationBar appearance] setTitleTextAttributes:@{ NSFontAttributeName : [UIFont fontWithName:@"Avenir-Heavy" size:16], NSForegroundColorAttributeName : [UIColor whiteColor]}]; 27 | 28 | return YES; 29 | } 30 | 31 | - (void)applicationWillResignActive:(UIApplication *)application 32 | { 33 | // 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. 34 | // 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. 35 | } 36 | 37 | - (void)applicationDidEnterBackground:(UIApplication *)application 38 | { 39 | // 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. 40 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 41 | } 42 | 43 | - (void)applicationWillEnterForeground:(UIApplication *)application 44 | { 45 | // 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. 46 | } 47 | 48 | - (void)applicationDidBecomeActive:(UIApplication *)application 49 | { 50 | // 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. 51 | } 52 | 53 | - (void)applicationWillTerminate:(UIApplication *)application 54 | { 55 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/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 | "extent" : "full-screen", 14 | "minimum-system-version" : "7.0", 15 | "subtype" : "retina4", 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 | "orientation" : "portrait", 48 | "idiom" : "iphone", 49 | "extent" : "full-screen", 50 | "scale" : "1x" 51 | }, 52 | { 53 | "orientation" : "portrait", 54 | "idiom" : "iphone", 55 | "extent" : "full-screen", 56 | "scale" : "2x" 57 | }, 58 | { 59 | "orientation" : "portrait", 60 | "idiom" : "iphone", 61 | "extent" : "full-screen", 62 | "subtype" : "retina4", 63 | "scale" : "2x" 64 | }, 65 | { 66 | "orientation" : "portrait", 67 | "idiom" : "ipad", 68 | "extent" : "to-status-bar", 69 | "scale" : "1x" 70 | }, 71 | { 72 | "orientation" : "portrait", 73 | "idiom" : "ipad", 74 | "extent" : "full-screen", 75 | "scale" : "1x" 76 | }, 77 | { 78 | "orientation" : "landscape", 79 | "idiom" : "ipad", 80 | "extent" : "to-status-bar", 81 | "scale" : "1x" 82 | }, 83 | { 84 | "orientation" : "landscape", 85 | "idiom" : "ipad", 86 | "extent" : "full-screen", 87 | "scale" : "1x" 88 | }, 89 | { 90 | "orientation" : "portrait", 91 | "idiom" : "ipad", 92 | "extent" : "to-status-bar", 93 | "scale" : "2x" 94 | }, 95 | { 96 | "orientation" : "portrait", 97 | "idiom" : "ipad", 98 | "extent" : "full-screen", 99 | "scale" : "2x" 100 | }, 101 | { 102 | "orientation" : "landscape", 103 | "idiom" : "ipad", 104 | "extent" : "to-status-bar", 105 | "scale" : "2x" 106 | }, 107 | { 108 | "orientation" : "landscape", 109 | "idiom" : "ipad", 110 | "extent" : "full-screen", 111 | "scale" : "2x" 112 | } 113 | ], 114 | "info" : { 115 | "version" : 1, 116 | "author" : "xcode" 117 | } 118 | } -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemoTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCelliOS7UIDemoTableViewCell.m 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCelliOS7UIDemoTableViewCell.h" 10 | 11 | #define BUTTON_THRESHOLD 80 12 | 13 | @implementation RMSwipeTableViewCelliOS7UIDemoTableViewCell 14 | 15 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 16 | { 17 | self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; 18 | if (self) { 19 | self.backViewbackgroundColor = [UIColor whiteColor]; 20 | self.detailTextLabel.numberOfLines = 2; 21 | self.revealDirection = RMSwipeTableViewCellRevealDirectionRight; 22 | self.animationType = RMSwipeTableViewCellAnimationTypeEaseOut; 23 | self.panElasticityStartingPoint = BUTTON_THRESHOLD; 24 | } 25 | return self; 26 | } 27 | 28 | -(UIButton*)deleteButton { 29 | if (!_deleteButton) { 30 | _deleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; 31 | [_deleteButton setBackgroundImage:[UIImage imageNamed:@"DeleteButtonBackground"] forState:UIControlStateNormal]; 32 | [_deleteButton setBackgroundImage:[UIImage imageNamed:@"DeleteButtonBackground"] forState:UIControlStateHighlighted]; 33 | [_deleteButton.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:18]]; 34 | [_deleteButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 35 | [_deleteButton setTitle:NSLocalizedString(@"Delete", nil) forState:UIControlStateNormal]; 36 | [_deleteButton setFrame:CGRectMake(CGRectGetMaxX(self.frame) - BUTTON_THRESHOLD, 0, BUTTON_THRESHOLD, CGRectGetHeight(self.contentView.frame))]; 37 | [_deleteButton addTarget:self action:@selector(deleteAction) forControlEvents:UIControlEventTouchUpInside]; 38 | [_deleteButton setAutoresizingMask:UIViewAutoresizingFlexibleHeight]; 39 | } 40 | return _deleteButton; 41 | } 42 | 43 | -(void)didStartSwiping { 44 | [super didStartSwiping]; 45 | [self.backView addSubview:self.deleteButton]; 46 | } 47 | 48 | -(void)deleteAction { 49 | if ([self.demoDelegate respondsToSelector:@selector(swipeTableViewCellDidDelete:)]) { 50 | [self.demoDelegate swipeTableViewCellDidDelete:self]; 51 | } 52 | } 53 | 54 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated 55 | { 56 | [super setSelected:selected animated:animated]; 57 | // Configure the view for the selected state 58 | } 59 | 60 | -(void)resetContentView { 61 | [UIView animateWithDuration:0.15f 62 | animations:^{ 63 | self.contentView.frame = CGRectOffset(self.contentView.bounds, 0, 0); 64 | } 65 | completion:^(BOOL finished) { 66 | self.shouldAnimateCellReset = YES; 67 | [self cleanupBackView]; 68 | }]; 69 | } 70 | 71 | -(void)cleanupBackView { 72 | [super cleanupBackView]; 73 | [_deleteButton removeFromSuperview]; 74 | _deleteButton = nil; 75 | } 76 | 77 | @end 78 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/Launch Screen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /RMSwipeTableViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCell.h 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | @import UIKit; 10 | 11 | typedef NS_ENUM(NSUInteger, RMSwipeTableViewCellRevealDirection) { 12 | RMSwipeTableViewCellRevealDirectionNone = -1, // disables panning 13 | RMSwipeTableViewCellRevealDirectionBoth = 0, 14 | RMSwipeTableViewCellRevealDirectionRight = 1, 15 | RMSwipeTableViewCellRevealDirectionLeft = 2, 16 | }; 17 | 18 | typedef NS_ENUM(NSUInteger, RMSwipeTableViewCellAnimationType) { 19 | RMSwipeTableViewCellAnimationTypeEaseInOut = 0 << 16, 20 | RMSwipeTableViewCellAnimationTypeEaseIn = 1 << 16, 21 | RMSwipeTableViewCellAnimationTypeEaseOut = 2 << 16, 22 | RMSwipeTableViewCellAnimationTypeEaseLinear = 3 << 16, 23 | RMSwipeTableViewCellAnimationTypeBounce = 4 << 16, // default 24 | }; 25 | 26 | @protocol RMSwipeTableViewCellDelegate; 27 | 28 | @interface RMSwipeTableViewCell : UITableViewCell 29 | 30 | /** 31 | * Customizable subview that is revealed when the user pans 32 | */ 33 | @property (nonatomic, strong) UIView *backView; 34 | 35 | /** 36 | * Determines the direction that swiping is enabled for. 37 | * Default is RMSwipeTableViewCellRevealDirectionBoth. 38 | */ 39 | @property (nonatomic, readwrite) RMSwipeTableViewCellRevealDirection revealDirection; 40 | 41 | /** 42 | * Determines the animation that occurs when panning ends. 43 | * Default is RMSwipeTableViewCellAnimationTypeBounce. 44 | */ 45 | @property (nonatomic, readwrite) RMSwipeTableViewCellAnimationType animationType; 46 | 47 | /** 48 | * Determines the animation duration when the cell's contentView animates back. 49 | * Default is 0.2f. 50 | */ 51 | @property (nonatomic, readwrite) CGFloat animationDuration; 52 | 53 | /** 54 | * Override this property at any point to stop the cell contentView from animation back into place on touch ended. Default is YES. 55 | * This is useful in the swipeTableViewCellWillResetState:fromLocation: delegate method. 56 | * Note: it will reset to YES in prepareForReuse. 57 | */ 58 | @property (nonatomic, readwrite) BOOL shouldAnimateCellReset; 59 | 60 | /** 61 | * When panning/swiping the cell's location is set to exponentially decay. The elasticity (also know as rubber banding) matches that of a UIScrollView/UITableView. 62 | * Default is YES 63 | */ 64 | @property (nonatomic, readwrite) BOOL panElasticity; 65 | 66 | /** 67 | * This determines the exponential decay of the pan. By default it matches that of UIScrollView. 68 | * Default is 0.55f. 69 | */ 70 | @property (nonatomic, readwrite) CGFloat panElasticityFactor; 71 | 72 | /** 73 | * When using panElasticity this property allows you to control at which point elasticitykicks in. 74 | * Default is 0.0f 75 | */ 76 | @property (nonatomic, readwrite) CGFloat panElasticityStartingPoint; 77 | 78 | /** 79 | * The color of the back view, visible when swiping the cell's contentView 80 | * Default is [UIColor colorWithWhite:0.92 alpha:1] 81 | */ 82 | @property (nonatomic, strong) UIColor *backViewbackgroundColor; 83 | 84 | /** 85 | * The methods declared by the RMSwipeTableViewCellDelegate protocol allows you to respond 86 | * to optional messages from the cell regarding it's interaction and animation behaviour 87 | */ 88 | @property (nonatomic, assign) id delegate; 89 | 90 | // The below instance methods provide behaviour that can be overriden in subclasses 91 | -(void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer; 92 | -(void)didStartSwiping; 93 | -(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer; 94 | -(void)animateContentViewForPoint:(CGPoint)point velocity:(CGPoint)velocity; 95 | -(void)resetCellFromPoint:(CGPoint)point velocity:(CGPoint)velocity; 96 | -(UIView*)backView; 97 | -(void)cleanupBackView; 98 | 99 | @end 100 | 101 | @protocol RMSwipeTableViewCellDelegate 102 | 103 | @optional 104 | 105 | -(void)swipeTableViewCellDidStartSwiping:(RMSwipeTableViewCell*)swipeTableViewCell; 106 | -(void)swipeTableViewCell:(RMSwipeTableViewCell*)swipeTableViewCell didSwipeToPoint:(CGPoint)point velocity:(CGPoint)velocity; 107 | -(void)swipeTableViewCellWillResetState:(RMSwipeTableViewCell*)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity; 108 | -(void)swipeTableViewCellDidResetState:(RMSwipeTableViewCell*)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity; 109 | 110 | /** 111 | * Defaults to YES. The backView is recreated everytime the state is about to reset. 112 | * 113 | * @param swipeTableViewCell The swipeable cell 114 | * 115 | * @return A boolean value that informs the cell the cell whether to cleanup. 116 | */ 117 | -(BOOL)swipeTableViewCellShouldCleanupBackView:(RMSwipeTableViewCell*)swipeTableViewCell; 118 | 119 | @end 120 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RMSwipeTableViewCell 2 | 3 | `RMSwipeTableViewCell` is a drop-in `UITableViewCell` subclass that supports pan gestures as seen in apps such as Clear, Mailbox, Sparrow and many more. 4 | 5 | `RMSwipeTableViewCell` allows for easy subclassing to customize the cell to match your needs. The class exposes useful class methods and uses delegate callbacks to handle actions in your `UITableViewController`. `RMSwipeTableViewCell` is compatible with iOS 5 and higher! 6 | 7 | `RMSwipeTableViewCell` works great out of the box, but has many properties to customize how the user interacts with the cell. 8 | 9 | ![RMSwipeTableViewCellDemo Animation](https://raw.github.com/runmad/RMSwipeTableViewCell/master/RMTableViewCellDemoAnimation.gif) 10 | 11 | [High Quality Video Example] 12 | 13 | ![RMSwipeTableViewCelliOS7Demo Animation](https://raw.github.com/runmad/RMSwipeTableViewCell/master/RMSwipeTableViewCelliOS7DemoAnimation.gif) 14 | 15 | ## Installing `RMSwipeTableViewCell` 16 | 17 | The example below and demo assumes you're compiling for iOS 6+. If you're supporting an older version of iOS use the appropriate methods for initializing and dequeuing the cells. `RMSwipeTableViewCell` is compatible with iOS 5 and above. 18 | 19 | `RMSwipeTableViewCell` includes two demos. The iOS 7 demo is an attempt to copy the "Delete Mode" behaviour seen in iOS 7 in the Messages.app. The demo is built with iOS 6 SDK. 20 | 21 | ### Using CocoaPods 22 | 23 | Add the following to your Podfile. 24 | 25 | ```ruby 26 | pod 'RMSwipeTableViewCell' 27 | ``` 28 | 29 | ### Manually 30 | 31 | Clone the repository to your machine or add `RMSwipeTableViewCell` as a submodule to your project. 32 | 33 | Add `RMSwipeTableViewCell.h` and `RMSwipeTableViewCell.m` to your project. Import the class header and register the cell class in your `UITableView`. 34 | 35 | ```Objective-C 36 | #import "RMSwipeTableViewCell.h" 37 | // add in your header file if you want to receive delegate callbacks on cell interactions 38 | 39 | -(void)viewDidLoad { 40 | [super viewDidLoad]; 41 | [self.tableView registerClass:[RMSwipeTableViewCell class] forCellReuseIdentifier:CellIdentifier]; 42 | } 43 | 44 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 45 | static NSString *CellIdentifier = @"Cell"; 46 | RMSwipeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 47 | cell.delegate = self; // optional 48 | return cell; 49 | } 50 | ``` 51 | 52 | ## Using `RMSwipeTableViewCell` 53 | 54 | `RMSwipeTableViewCell` can be used as-is, but you are required to customize the `backView` with subviews, etc. to suit your needs (see Subclassing `RMSwipeTableViewCell`). 55 | 56 | The `RMSwipeTableViewCellDemo` project provides an example of subclassing and customizing the cell with custom views and actions. 57 | 58 | ### Properties 59 | 60 | `RMSwipeTableViewCell` lets you customize and control animations and panning gestures. The demo uses all default states. 61 | 62 | ```Objective-C 63 | UIView *backView; 64 | RMSwipeTableViewCellRevealDirection revealDirection; // default is RMSwipeTableViewCellRevealDirectionBoth 65 | RMSwipeTableViewCellAnimationType animationType; // default is RMSwipeTableViewCellAnimationTypeBounce 66 | float animationDuration; // default is 0.2 67 | BOOL shouldAnimateCellReset; // this can be overridden at any point (useful in the swipeTableViewCellWillResetState:fromLocation: delegate method). default is YES - note: it will reset to YES in prepareForReuse 68 | BOOL panElasticity; // When panning/swiping the cell's location is set to exponentially decay. The rubber banding matches that of a UIScrollView/UITableView. default is YES 69 | CGFloat panElasticityFactor; // This determines the exponential decay of the pan. By default it matches that of UIScrollView. 70 | CGFloat panElasticityStartingPoint; // When using panElasticity this property allows you to control at which point elasticitykicks in. default is 0 71 | UIColor *backViewbackgroundColor; // default is [UIColor colorWithWhite:0.92 alpha:1] 72 | ``` 73 | 74 | ## Subclassing `RMSwipeTableViewCell` 75 | 76 | Subclassing `RMSwipeTableViewCell` is the best way to customize the cell beyond the default properties and any delegate callbacks. Subclassing allows you to create subviews for the `backView`, extend properties if needed and override class methods. 77 | 78 | See the demo for an example of subclassing usage. 79 | 80 | ## `RMSwipeTableViewCell` Delegate Methods 81 | 82 | `RMSwipeTableViewCell` has a number of (optional) delegate methods that provide easy extensibility for subclassing and controlling cell functionality. The delegate methods are straightforward and the demo project shows a few examples of usage. 83 | 84 | All delegate methods that return the CGPoint location take into account the panOffset value (panOffset is actual location of the contentView vs. the translation value of the touch location). 85 | 86 | ```Objective-C 87 | // notifies the delegate when the user starts panning 88 | -(void)swipeTableViewCellDidStartSwiping:(RMSwipeTableViewCell*)swipeTableViewCell; 89 | 90 | // notifies the delegate when the panning location changes 91 | -(void)swipeTableViewCell:(RMSwipeTableViewCell*)swipeTableViewCell didSwipeToPoint:(CGPoint)point velocity:(CGPoint)velocity; 92 | 93 | // notifies the delegate when the user lifts their finger from the screen and cell will reset 94 | -(void)swipeTableViewCellWillResetState:(RMSwipeTableViewCell*)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity; 95 | 96 | // notifies the delegate when the cell has reset itself back to its starting state. This is useful for doing further animation or updates on the cell after the reset animation has completed 97 | -(void)swipeTableViewCellDidResetState:(RMSwipeTableViewCell*)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity; 98 | 99 | // Defaults to YES (the backView is recreated everytime the state is about to reset) 100 | -(BOOL)swipeTableViewCellShouldCleanupBackView:(RMSwipeTableViewCell*)swipeTableViewCell; 101 | ``` 102 | 103 | ## Credit 104 | 105 | Developed by Rune Madsen ([@runmad] and [runmad.com]). 106 | 107 | ## Feedback 108 | 109 | I appreciate feedback. Create Github issues, pull requests or connect with me on Twitter. 110 | 111 | I'd love to see and hear from you if you use it in a project. 112 | 113 | ## License 114 | 115 | `RMSwipeTableViewCell` is available under the MIT license. See the LICENSE file for more info. 116 | 117 | ## Version History 118 | 119 | ### 0.6.1 120 | * Updating demos to work better on iOS 7 121 | 122 | ### 0.6 123 | * Cleaned up init logic 124 | * Add new delegate method `-(BOOL)swipeTableViewCellShouldCleanupBackView:(RMSwipeTableViewCell*)swipeTableViewCell;` 125 | * Add `panElasticityFactor` 126 | * Xcode 5 documentation 127 | * Catching all states of `UIPanGestureRecognizer` 128 | * Fixed `UIViewAnimationOption` warning 129 | * Updated demo with support for iOS 7 spring animations 130 | 131 | ### 0.5 132 | * Made a few improvements to the backView and some logic 133 | * Added another demo to show off tweaking of appearance to match iOS 7 behaviour and UI 134 | 135 | ### 0.4 136 | * Added `panElasticityStartingPoint` to allow for finer control of when elasticity (if enabled) goes into effect 137 | * Added .gif for the README to show off the class better on Github 138 | * Fixed some logic issues I found with the demo project 139 | 140 | ### 0.3 141 | * Deprecated a number of delegate methods to improve the the translation values being returned 142 | * Set `RMSwipeTableViewCellAnimationType`s to match UIViewAnimationOptions to simplify logic 143 | 144 | ### 0.2 145 | * Added velocity property to delegate callbacks 146 | * Added iOS 6 `UIScrollView` rubber banding algorithm (https://twitter.com/chpwn/status/291794740553338880) 147 | * Added podspec 148 | * Fixed a few issues 149 | 150 | ### 0.1 151 | * Initial release 152 | 153 | [High Quality Video Example]: http://www.runmad.com/development/RMTableViewCellDemoVideo.mp4 154 | [@runmad]: http://www.twitter.com/runmad 155 | [runmad.com]: http://www.runmad.com 156 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMSwipeTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewController.m 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewController.h" 10 | 11 | #define LOG_DELEGATE_METHODS 0 12 | 13 | @interface RMSwipeTableViewController () 14 | 15 | @end 16 | 17 | @implementation RMSwipeTableViewController 18 | 19 | - (id)initWithStyle:(UITableViewStyle)style { 20 | self = [super initWithStyle:style]; 21 | if (self) { 22 | [self.navigationItem setTitle:@"House Lannister"]; 23 | 24 | static NSString *CellIdentifier = @"Cell"; 25 | [self.tableView registerClass:[RMPersonTableViewCell class] forCellReuseIdentifier:CellIdentifier]; 26 | [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 27 | [self.tableView setRowHeight:64]; 28 | 29 | UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(resetTableView)]; 30 | [self.navigationItem setRightBarButtonItem:barButtonItem]; 31 | 32 | UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.tableView.frame), 200)]; 33 | [view setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 34 | [view setBackgroundColor:[UIColor colorWithWhite:0.92 alpha:1]]; 35 | UIImageView *sigilImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"HouseStarkSigil"]]; 36 | [sigilImageView setCenter:view.center]; 37 | [sigilImageView setAlpha:0.3]; 38 | [view addSubview:sigilImageView]; 39 | self.tableView.tableFooterView = view; 40 | 41 | [self.tableView setBackgroundColor:view.backgroundColor]; 42 | 43 | self.tableView.contentInset = self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, - CGRectGetHeight(view.frame), 0); 44 | } 45 | return self; 46 | } 47 | 48 | -(void)resetTableView { 49 | [_array removeAllObjects]; 50 | _array = nil; 51 | [self.tableView reloadData]; 52 | } 53 | 54 | - (void)viewDidLoad 55 | { 56 | [super viewDidLoad]; 57 | 58 | // Uncomment the following line to preserve selection between presentations. 59 | // self.clearsSelectionOnViewWillAppear = NO; 60 | 61 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 62 | // self.navigationItem.rightBarButtonItem = self.editButtonItem; 63 | } 64 | 65 | - (void)didReceiveMemoryWarning 66 | { 67 | [super didReceiveMemoryWarning]; 68 | // Dispose of any resources that can be recreated. 69 | } 70 | 71 | -(NSMutableArray*)array { 72 | if (!_array) { 73 | _array = [@[ 74 | [@{@"name" : @"Cersei Lannister", @"title" : @"Queen of the Seven Kingdoms", @"isFavourite" : @NO, @"image" : @"cersei" } mutableCopy], 75 | [@{@"name" : @"Jaime Lannister", @"title" : @"Kingslayer", @"isFavourite" : @NO, @"image" : @"jaime" } mutableCopy], 76 | [@{@"name" : @"Joffrey Baratheon", @"title" : @"The Illborn", @"isFavourite" : @NO, @"image" : @"joffrey" } mutableCopy], 77 | [@{@"name" : @"Tyrion Lannister", @"title" : @"The Halfman", @"isFavourite" : @NO, @"image" : @"tyrion" } mutableCopy], 78 | [@{@"name" : @"Tywin Lannister", @"title" : @"Lord of Casterly Rock", @"isFavourite" : @NO, @"image" : @"tywin" } mutableCopy]] 79 | mutableCopy]; 80 | } 81 | return _array; 82 | } 83 | 84 | #pragma mark - Table view data source 85 | 86 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 87 | { 88 | // Return the number of sections. 89 | return 1; 90 | } 91 | 92 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 93 | { 94 | // Return the number of rows in the section. 95 | return [self.array count]; 96 | } 97 | 98 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 99 | { 100 | static NSString *CellIdentifier = @"Cell"; 101 | RMPersonTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 102 | 103 | cell.textLabel.text = (self.array)[indexPath.row][@"name"]; 104 | cell.detailTextLabel.text = (self.array)[indexPath.row][@"title"]; 105 | [cell setThumbnail:[UIImage imageNamed:(self.array)[indexPath.row][@"image"]]]; 106 | [cell setFavourite:[(self.array)[indexPath.row][@"isFavourite"] boolValue] animated:NO]; 107 | cell.delegate = self; 108 | 109 | return cell; 110 | } 111 | 112 | #pragma mark - Table view delegate 113 | 114 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 115 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 116 | } 117 | 118 | #pragma mark - Swipe Table View Cell Delegate 119 | 120 | -(void)swipeTableViewCellDidStartSwiping:(RMSwipeTableViewCell *)swipeTableViewCell { 121 | #if LOG_DELEGATE_METHODS 122 | NSLog(@"swipeTableViewCellDidStartSwiping: %@", swipeTableViewCell); 123 | #endif 124 | } 125 | 126 | -(void)swipeTableViewCell:(RMPersonTableViewCell *)swipeTableViewCell didSwipeToPoint:(CGPoint)point velocity:(CGPoint)velocity { 127 | #if LOG_DELEGATE_METHODS 128 | NSLog(@"swipeTableViewCell: %@ didSwipeToPoint: %@ velocity: %@", swipeTableViewCell, NSStringFromCGPoint(point), NSStringFromCGPoint(velocity)); 129 | #endif 130 | } 131 | 132 | -(void)swipeTableViewCellWillResetState:(RMSwipeTableViewCell *)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity { 133 | #if LOG_DELEGATE_METHODS 134 | NSLog(@"swipeTableViewCellWillResetState: %@ fromPoint: %@ animation: %d, velocity: %@", swipeTableViewCell, NSStringFromCGPoint(point), animation, NSStringFromCGPoint(velocity)); 135 | #endif 136 | if (point.x >= CGRectGetHeight(swipeTableViewCell.frame)) { 137 | NSIndexPath *indexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 138 | if ([(self.array)[indexPath.row][@"isFavourite"] boolValue]) { 139 | (self.array)[indexPath.row][@"isFavourite"] = @NO; 140 | } else { 141 | (self.array)[indexPath.row][@"isFavourite"] = @YES; 142 | } 143 | [(RMPersonTableViewCell*)swipeTableViewCell setFavourite:[(self.array)[indexPath.row][@"isFavourite"] boolValue] animated:YES]; 144 | } else if (point.x < 0 && -point.x >= CGRectGetHeight(swipeTableViewCell.frame)) { 145 | swipeTableViewCell.shouldAnimateCellReset = NO; 146 | [[(RMPersonTableViewCell*)swipeTableViewCell checkmarkGreyImageView] removeFromSuperview]; 147 | [UIView animateWithDuration:0.25 148 | delay:0 149 | options:UIViewAnimationCurveLinear 150 | animations:^{ 151 | swipeTableViewCell.contentView.frame = CGRectOffset(swipeTableViewCell.contentView.bounds, swipeTableViewCell.contentView.frame.size.width, 0); 152 | } 153 | completion:^(BOOL finished) { 154 | [swipeTableViewCell.contentView setHidden:YES]; 155 | NSIndexPath *indexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 156 | [self.array removeObjectAtIndex:indexPath.row]; 157 | [self.tableView beginUpdates]; 158 | [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle]; 159 | [self.tableView endUpdates]; 160 | } 161 | ]; 162 | } 163 | } 164 | 165 | -(void)swipeTableViewCellDidResetState:(RMSwipeTableViewCell *)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity { 166 | #if LOG_DELEGATE_METHODS 167 | NSLog(@"swipeTableViewCellDidResetState: %@ fromPoint: %@ animation: %d, velocity: %@", swipeTableViewCell, NSStringFromCGPoint(point), animation, NSStringFromCGPoint(velocity)); 168 | #endif 169 | if (point.x < 0 && -point.x > CGRectGetHeight(swipeTableViewCell.frame)) { 170 | NSIndexPath *indexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 171 | [self.array removeObjectAtIndex:indexPath.row]; 172 | [self.tableView beginUpdates]; 173 | [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 174 | [self.tableView endUpdates]; 175 | } 176 | } 177 | 178 | @end 179 | -------------------------------------------------------------------------------- /RMSwipeTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCell.m 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2012-11-24. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCell.h" 10 | 11 | @implementation RMSwipeTableViewCell 12 | 13 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 14 | { 15 | self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 16 | if (self) { 17 | [self initialize]; 18 | } 19 | return self; 20 | } 21 | 22 | - (id)initWithCoder:(NSCoder *)aDecoder 23 | { 24 | self = [super initWithCoder:aDecoder]; 25 | if (self) { 26 | [self initialize]; 27 | } 28 | return self; 29 | } 30 | 31 | - (void)initialize 32 | { 33 | // We need to set the contentView's background color, otherwise the sides are clear on the swipe and animations 34 | [self.contentView setBackgroundColor:[UIColor whiteColor]]; 35 | UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 36 | [panGestureRecognizer setDelegate:self]; 37 | [self addGestureRecognizer:panGestureRecognizer]; 38 | 39 | self.revealDirection = RMSwipeTableViewCellRevealDirectionBoth; 40 | self.animationType = RMSwipeTableViewCellAnimationTypeBounce; 41 | self.animationDuration = 0.2f; 42 | self.shouldAnimateCellReset = YES; 43 | self.backViewbackgroundColor = [UIColor colorWithWhite:0.92 alpha:1]; 44 | self.panElasticity = YES; 45 | self.panElasticityFactor = 0.55f; 46 | self.panElasticityStartingPoint = 0.0f; 47 | 48 | UIView *backgroundView = [[UIView alloc] initWithFrame:self.frame]; 49 | backgroundView.backgroundColor = [UIColor whiteColor]; 50 | self.backgroundView = backgroundView; 51 | } 52 | 53 | -(void)prepareForReuse { 54 | [super prepareForReuse]; 55 | self.shouldAnimateCellReset = YES; 56 | } 57 | 58 | #pragma mark - Gesture recognizer delegate 59 | 60 | -(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer { 61 | // We only want to deal with the gesture of it's a pan gesture 62 | if ([panGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && self.revealDirection != RMSwipeTableViewCellRevealDirectionNone) { 63 | CGPoint translation = [panGestureRecognizer translationInView:[self superview]]; 64 | return (fabs(translation.x) / fabs(translation.y) > 1) ? YES : NO; 65 | } else { 66 | return NO; 67 | } 68 | } 69 | 70 | -(void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecognizer { 71 | CGPoint translation = [panGestureRecognizer translationInView:panGestureRecognizer.view]; 72 | CGPoint velocity = [panGestureRecognizer velocityInView:panGestureRecognizer.view]; 73 | CGFloat panOffset = translation.x; 74 | if (self.panElasticity) { 75 | if (ABS(translation.x) > self.panElasticityStartingPoint) { 76 | CGFloat width = CGRectGetWidth(self.frame); 77 | CGFloat offset = fabs(translation.x); 78 | panOffset = (offset * self.panElasticityFactor * width) / (offset * self.panElasticityFactor + width); 79 | panOffset *= translation.x < 0 ? -1.0f : 1.0f; 80 | if (self.panElasticityStartingPoint > 0) { 81 | panOffset = translation.x > 0 ? panOffset + self.panElasticityStartingPoint / 2 : panOffset - self.panElasticityStartingPoint / 2; 82 | } 83 | } 84 | } 85 | CGPoint actualTranslation = CGPointMake(panOffset, translation.y); 86 | if (panGestureRecognizer.state == UIGestureRecognizerStateBegan && [panGestureRecognizer numberOfTouches] > 0) { 87 | [self didStartSwiping]; 88 | [self animateContentViewForPoint:actualTranslation velocity:velocity]; 89 | } else if (panGestureRecognizer.state == UIGestureRecognizerStateChanged && [panGestureRecognizer numberOfTouches] > 0) { 90 | [self animateContentViewForPoint:actualTranslation velocity:velocity]; 91 | } else { 92 | [self resetCellFromPoint:actualTranslation velocity:velocity]; 93 | } 94 | } 95 | 96 | -(void)didStartSwiping { 97 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellDidStartSwiping:)]) { 98 | [self.delegate swipeTableViewCellDidStartSwiping:self]; 99 | } 100 | 101 | self.backView = [[UIView alloc] init]; 102 | self.backView.backgroundColor = self.backViewbackgroundColor; 103 | self.backView.translatesAutoresizingMaskIntoConstraints = NO; 104 | [self.backgroundView addSubview:self.backView]; 105 | [self.backgroundView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_backView]|" 106 | options:0 107 | metrics:nil 108 | views:NSDictionaryOfVariableBindings(_backView)]]; 109 | [self.backgroundView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_backView]|" 110 | options:0 111 | metrics:nil 112 | views:NSDictionaryOfVariableBindings(_backView)]]; 113 | } 114 | 115 | #pragma mark - Gesture animations 116 | 117 | -(void)animateContentViewForPoint:(CGPoint)point velocity:(CGPoint)velocity { 118 | if ((point.x > 0 && self.revealDirection == RMSwipeTableViewCellRevealDirectionLeft) || (point.x < 0 && self.revealDirection == RMSwipeTableViewCellRevealDirectionRight) || self.revealDirection == RMSwipeTableViewCellRevealDirectionBoth) { 119 | self.contentView.frame = CGRectOffset(self.contentView.bounds, point.x, 0); 120 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCell:didSwipeToPoint:velocity:)]) { 121 | [self.delegate swipeTableViewCell:self didSwipeToPoint:point velocity:velocity]; 122 | } 123 | } else if ((point.x > 0 && self.revealDirection == RMSwipeTableViewCellRevealDirectionRight) || (point.x < 0 && self.revealDirection == RMSwipeTableViewCellRevealDirectionLeft)) { 124 | self.contentView.frame = CGRectOffset(self.contentView.bounds, 0, 0); 125 | } 126 | } 127 | 128 | -(void)resetCellFromPoint:(CGPoint)point velocity:(CGPoint)velocity { 129 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellWillResetState:fromPoint:animation:velocity:)]) { 130 | [self.delegate swipeTableViewCellWillResetState:self fromPoint:point animation:self.animationType velocity:velocity]; 131 | } 132 | if (self.shouldAnimateCellReset == NO) { 133 | return; 134 | } 135 | if ((self.revealDirection == RMSwipeTableViewCellRevealDirectionLeft && point.x < 0) || (self.revealDirection == RMSwipeTableViewCellRevealDirectionRight && point.x > 0)) { 136 | return; 137 | } 138 | if (self.animationType == RMSwipeTableViewCellAnimationTypeBounce) { 139 | void (^completionBlock)(BOOL) = ^(BOOL finished) { 140 | BOOL shouldCleanupBackView = YES; 141 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellShouldCleanupBackView:)]) { 142 | shouldCleanupBackView = [self.delegate swipeTableViewCellShouldCleanupBackView:self]; 143 | } 144 | if (shouldCleanupBackView) { 145 | [self cleanupBackView]; 146 | } 147 | 148 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellDidResetState:fromPoint:animation:velocity:)]) { 149 | [self.delegate swipeTableViewCellDidResetState:self fromPoint:point animation:self.animationType velocity:velocity]; 150 | } 151 | }; 152 | [UIView animateWithDuration:self.animationDuration 153 | delay:0 154 | usingSpringWithDamping:0.7 155 | initialSpringVelocity:point.x / 5 156 | options:UIViewAnimationOptionAllowUserInteraction 157 | animations:^{ 158 | self.contentView.frame = self.contentView.bounds; 159 | } 160 | completion:completionBlock]; 161 | } else { 162 | [UIView animateWithDuration:self.animationDuration 163 | delay:0 164 | options:(UIViewAnimationOptions)self.animationType 165 | animations:^{ 166 | self.contentView.frame = CGRectOffset(self.contentView.bounds, 0, 0); 167 | } 168 | completion:^(BOOL finished) { 169 | 170 | BOOL shouldCleanupBackView = YES; 171 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellShouldCleanupBackView:)]) { 172 | shouldCleanupBackView = [self.delegate swipeTableViewCellShouldCleanupBackView:self]; 173 | } 174 | if (shouldCleanupBackView) { 175 | [self cleanupBackView]; 176 | } 177 | 178 | if ([self.delegate respondsToSelector:@selector(swipeTableViewCellDidResetState:fromPoint:animation:velocity:)]) { 179 | [self.delegate swipeTableViewCellDidResetState:self fromPoint:point animation:self.animationType velocity:velocity]; 180 | } 181 | } 182 | ]; 183 | } 184 | } 185 | 186 | -(void)cleanupBackView { 187 | [_backView removeFromSuperview]; 188 | _backView = nil; 189 | } 190 | 191 | @end 192 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMSwipeTableViewCelliOS7UIDemoViewController.m 3 | // RMSwipeTableViewCelliOS7UIDemo 4 | // 5 | // Created by Rune Madsen on 2013-06-16. 6 | // Copyright (c) 2013 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMSwipeTableViewCelliOS7UIDemoViewController.h" 10 | 11 | @interface RMSwipeTableViewCelliOS7UIDemoViewController () 12 | 13 | @end 14 | 15 | @implementation RMSwipeTableViewCelliOS7UIDemoViewController 16 | 17 | - (id)initWithStyle:(UITableViewStyle)style 18 | { 19 | self = [super initWithStyle:style]; 20 | if (self) { 21 | // Custom initialization 22 | } 23 | return self; 24 | } 25 | 26 | - (void)viewDidLoad 27 | { 28 | [super viewDidLoad]; 29 | 30 | [self.tableView registerClass:[RMSwipeTableViewCelliOS7UIDemoTableViewCell class] forCellReuseIdentifier:@"Cell"]; 31 | [self.tableView setRowHeight:77]; 32 | 33 | [self.navigationItem setTitle:NSLocalizedString(@"Messages", nil)]; 34 | 35 | // Uncomment the following line to preserve selection between presentations. 36 | // self.clearsSelectionOnViewWillAppear = NO; 37 | 38 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 39 | // self.navigationItem.rightBarButtonItem = self.editButtonItem; 40 | } 41 | 42 | -(void)resetDemo { 43 | _messagesArray = nil; 44 | [self.tableView reloadData]; 45 | [self.navigationItem setRightBarButtonItem:nil animated:YES]; 46 | } 47 | 48 | -(NSMutableArray*)messagesArray { 49 | if (!_messagesArray) { 50 | _messagesArray = [@[] mutableCopy]; 51 | [_messagesArray addObject:@{ @"sender" : @"Jonathan Ive", @"message" : @"I can't believe what people are saying about those iOS 7 icons! Are they missing aluminium or something?" }]; 52 | [_messagesArray addObject:@{ @"sender" : @"Phil Schiller", @"message" : @"Thanks! I am letting my hair grow a bit longer this summer." }]; 53 | [_messagesArray addObject:@{ @"sender" : @"Tim Cook", @"message" : @"Haha, yeah. I just love mocking the competition with those numbers! 😁" }]; 54 | [_messagesArray addObject:@{ @"sender" : @"Craig Federighi", @"message" : @"I know, I am using 5 screens on my Mac now, I love that feature!" }]; 55 | [_messagesArray addObject:@{ @"sender" : @"Peter Openheimer", @"message" : @"Honestly, I am not worried, the stock will bounce back..." }]; 56 | [_messagesArray addObject:@{ @"sender" : @"Scott Forstall", @"message" : @"Hey, why are you not responding to my messages???" }]; 57 | // [_messagesArray addObject:@{ @"sender" : @"", @"message" : @"" }]; 58 | } 59 | return _messagesArray; 60 | } 61 | 62 | - (void)didReceiveMemoryWarning 63 | { 64 | [super didReceiveMemoryWarning]; 65 | // Dispose of any resources that can be recreated. 66 | } 67 | 68 | #pragma mark - Table view data source 69 | 70 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 71 | { 72 | // Return the number of sections. 73 | return 1; 74 | } 75 | 76 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 77 | { 78 | // Return the number of rows in the section. 79 | return [self.messagesArray count]; 80 | } 81 | 82 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 83 | { 84 | static NSString *CellIdentifier = @"Cell"; 85 | RMSwipeTableViewCelliOS7UIDemoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 86 | cell.textLabel.text = [self.messagesArray objectAtIndex:indexPath.row][@"sender"]; 87 | cell.detailTextLabel.text = [self.messagesArray objectAtIndex:indexPath.row][@"message"]; 88 | cell.selectionStyle = UITableViewCellSelectionStyleGray; 89 | cell.delegate = self; 90 | cell.demoDelegate = self; 91 | return cell; 92 | } 93 | 94 | /* 95 | // Override to support conditional editing of the table view. 96 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 97 | { 98 | // Return NO if you do not want the specified item to be editable. 99 | return YES; 100 | } 101 | */ 102 | 103 | /* 104 | // Override to support editing the table view. 105 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 106 | { 107 | if (editingStyle == UITableViewCellEditingStyleDelete) { 108 | // Delete the row from the data source 109 | [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 110 | } 111 | else if (editingStyle == UITableViewCellEditingStyleInsert) { 112 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 113 | } 114 | } 115 | */ 116 | 117 | /* 118 | // Override to support rearranging the table view. 119 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 120 | { 121 | } 122 | */ 123 | 124 | /* 125 | // Override to support conditional rearranging of the table view. 126 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 127 | { 128 | // Return NO if you do not want the item to be re-orderable. 129 | return YES; 130 | } 131 | */ 132 | 133 | #pragma mark - Table view delegate 134 | 135 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 136 | { 137 | if (self.selectedIndexPath.row != indexPath.row) { 138 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 139 | [self resetSelectedCell]; 140 | } 141 | if (self.selectedIndexPath.row == indexPath.row) { 142 | [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 143 | [self resetSelectedCell]; 144 | } 145 | } 146 | 147 | -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 148 | if (self.selectedIndexPath) { 149 | [self resetSelectedCell]; 150 | } 151 | } 152 | 153 | #pragma mark - RMSwipeTableViewCelliOS7UIDemoTableViewCell delegate method 154 | 155 | -(void)swipeTableViewCellDidDelete:(RMSwipeTableViewCelliOS7UIDemoTableViewCell *)swipeTableViewCell { 156 | NSIndexPath *indexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 157 | [self.messagesArray removeObjectAtIndex:indexPath.row]; 158 | [swipeTableViewCell resetContentView]; 159 | [self.tableView beginUpdates]; 160 | [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 161 | [self.tableView endUpdates]; 162 | if ([self.messagesArray count]) { 163 | UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Reset", nil) style:UIBarButtonItemStylePlain target:self action:@selector(resetDemo)]; 164 | [self.navigationItem setRightBarButtonItem:barButtonItem animated:YES]; 165 | } 166 | } 167 | 168 | #pragma mark - RMSwipeTableViewCell delegate methods 169 | 170 | -(void)swipeTableViewCellDidStartSwiping:(RMSwipeTableViewCell *)swipeTableViewCell { 171 | NSIndexPath *indexPathForCell = [self.tableView indexPathForCell:swipeTableViewCell]; 172 | if (self.selectedIndexPath.row != indexPathForCell.row) { 173 | [self resetSelectedCell]; 174 | } 175 | } 176 | 177 | -(void)resetSelectedCell { 178 | RMSwipeTableViewCelliOS7UIDemoTableViewCell *cell = (RMSwipeTableViewCelliOS7UIDemoTableViewCell*)[self.tableView cellForRowAtIndexPath:self.selectedIndexPath]; 179 | [cell resetContentView]; 180 | self.selectedIndexPath = nil; 181 | cell.selectionStyle = UITableViewCellSelectionStyleGray; 182 | } 183 | 184 | -(void)swipeTableViewCellWillResetState:(RMSwipeTableViewCell *)swipeTableViewCell fromPoint:(CGPoint)point animation:(RMSwipeTableViewCellAnimationType)animation velocity:(CGPoint)velocity { 185 | if (velocity.x <= fabsf(400) && point.x < -80) { 186 | self.selectedIndexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 187 | swipeTableViewCell.shouldAnimateCellReset = NO; 188 | swipeTableViewCell.selectionStyle = UITableViewCellSelectionStyleNone; 189 | NSTimeInterval duration = MIN(fabsf(point.x) / fabsf(velocity.x), 0.10f); 190 | [UIView animateWithDuration:duration 191 | delay:0 192 | options:UIViewAnimationOptionCurveLinear 193 | animations:^{ 194 | swipeTableViewCell.contentView.frame = CGRectOffset(swipeTableViewCell.contentView.bounds, point.x - (ABS(velocity.x) / 150), 0); 195 | } 196 | completion:^(BOOL finished) { 197 | [UIView animateWithDuration:duration 198 | delay:0 199 | options:UIViewAnimationOptionCurveEaseOut 200 | animations:^{ 201 | swipeTableViewCell.contentView.frame = CGRectOffset(swipeTableViewCell.contentView.bounds, -80, 0); 202 | } 203 | completion:^(BOOL finished) { 204 | }]; 205 | }]; 206 | } 207 | // The below behaviour is not normal as of iOS 7 beta seed 1 208 | // for Messages.app, but it is for Mail.app. 209 | // The user has to pan/swipe with a certain amount of velocity 210 | // before the cell goes to delete-state. If the user just pans 211 | // above the threshold for the button but without enough velocity, 212 | // the cell will reset. 213 | // Mail.app will, however allow for the cell to reveal the button 214 | // even if the velocity isn't high, but the pan translation is 215 | // above the threshold. I am assuming it'll get more consistent 216 | // in later seed of the iOS 7 beta 217 | /* 218 | else if (velocity.x > -500 && point.x < -80) { 219 | self.selectedIndexPath = [self.tableView indexPathForCell:swipeTableViewCell]; 220 | swipeTableViewCell.shouldAnimateCellReset = NO; 221 | swipeTableViewCell.selectionStyle = UITableViewCellSelectionStyleNone; 222 | NSTimeInterval duration = MIN(-point.x / ABS(velocity.x), 0.15f); 223 | [UIView animateWithDuration:duration 224 | animations:^{ 225 | swipeTableViewCell.contentView.frame = CGRectOffset(swipeTableViewCell.contentView.bounds, -80, 0); 226 | }]; 227 | } 228 | */ 229 | } 230 | 231 | @end 232 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo/View.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1552 5 | 12E55 6 | 3084 7 | 1187.39 8 | 626.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 3084 12 | 13 | 14 | IBNSLayoutConstraint 15 | IBProxyObject 16 | IBUIView 17 | 18 | 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | PluginDependencyRecalculationVersion 23 | 24 | 25 | 26 | 27 | IBFilesOwner 28 | IBCocoaTouchFramework 29 | 30 | 31 | IBFirstResponder 32 | IBCocoaTouchFramework 33 | 34 | 35 | 36 | 274 37 | 38 | 39 | 40 | 274 41 | {320, 548} 42 | 43 | 44 | _NS:9 45 | {750, 755} 46 | 47 | 3 48 | MQA 49 | 50 | 2 51 | 52 | 53 | IBCocoaTouchFramework 54 | 55 | 56 | {{0, 20}, {320, 548}} 57 | 58 | 59 | 60 | 3 61 | MQA 62 | 63 | 64 | 65 | 66 | IBUIScreenMetrics 67 | 68 | YES 69 | 70 | 71 | 72 | 73 | 74 | {320, 568} 75 | {568, 320} 76 | 77 | 78 | IBCocoaTouchFramework 79 | Retina 4 Full Screen 80 | 2 81 | 82 | IBCocoaTouchFramework 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 0 91 | 92 | 93 | 94 | 95 | 96 | 1 97 | 98 | 99 | 100 | 101 | 4 102 | 0 103 | 104 | 4 105 | 1 106 | 107 | 0.0 108 | 109 | 1000 110 | 111 | 8 112 | 29 113 | 3 114 | 115 | 116 | 117 | 3 118 | 0 119 | 120 | 3 121 | 1 122 | 123 | 0.0 124 | 125 | 1000 126 | 127 | 8 128 | 29 129 | 3 130 | 131 | 132 | 133 | 5 134 | 0 135 | 136 | 5 137 | 1 138 | 139 | 0.0 140 | 141 | 1000 142 | 143 | 8 144 | 29 145 | 3 146 | 147 | 148 | 149 | 6 150 | 0 151 | 152 | 6 153 | 1 154 | 155 | 0.0 156 | 157 | 1000 158 | 159 | 9 160 | 40 161 | 3 162 | 163 | 164 | 165 | 166 | 167 | 168 | -1 169 | 170 | 171 | File's Owner 172 | 173 | 174 | -2 175 | 176 | 177 | 178 | 179 | 3 180 | 181 | 182 | 183 | 184 | 32 185 | 186 | 187 | 188 | 189 | 34 190 | 191 | 192 | 193 | 194 | 37 195 | 196 | 197 | 198 | 199 | 39 200 | 201 | 202 | 203 | 204 | 205 | 206 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 207 | UIResponder 208 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 209 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 210 | 211 | 212 | 213 | 214 | 215 | 216 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 217 | 218 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 219 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 220 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 221 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 222 | 223 | 224 | 225 | 226 | 227 | 44 228 | 229 | 230 | 0 231 | IBCocoaTouchFramework 232 | YES 233 | 3 234 | YES 235 | 2083 236 | 237 | 238 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo/RMPersonTableViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // RMPersonTableViewCell.m 3 | // RMSwipeTableView 4 | // 5 | // Created by Rune Madsen on 2013-05-13. 6 | // Copyright (c) 2015 The App Boutique. All rights reserved. 7 | // 8 | 9 | #import "RMPersonTableViewCell.h" 10 | 11 | @implementation RMPersonTableViewCell 12 | 13 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 14 | { 15 | self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; 16 | if (self) { 17 | self.textLabel.font = [UIFont fontWithName:@"Avenir-Heavy" size:16]; 18 | self.textLabel.backgroundColor = self.contentView.backgroundColor; 19 | self.detailTextLabel.font = [UIFont fontWithName:@"Avenir-Book" size:14]; 20 | self.detailTextLabel.backgroundColor = self.contentView.backgroundColor; 21 | 22 | self.profileImageView = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 54, 54)]; 23 | [self.profileImageView setBackgroundColor:[UIColor whiteColor]]; 24 | [self.profileImageView setClipsToBounds:YES]; 25 | [self.profileImageView setContentMode:UIViewContentModeScaleAspectFill]; 26 | [self.profileImageView.layer setBorderColor:[UIColor colorWithWhite:0 alpha:0.3].CGColor]; 27 | [self.profileImageView.layer setBorderWidth:1]; 28 | [self.profileImageView.layer setCornerRadius:2]; 29 | [self.contentView addSubview:self.profileImageView]; 30 | } 31 | return self; 32 | } 33 | 34 | -(UIImageView*)checkmarkGreyImageView { 35 | if (!_checkmarkGreyImageView) { 36 | _checkmarkGreyImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetHeight(self.frame), CGRectGetHeight(self.frame))]; 37 | [_checkmarkGreyImageView setImage:[UIImage imageNamed:@"CheckmarkGrey"]]; 38 | [_checkmarkGreyImageView setContentMode:UIViewContentModeCenter]; 39 | [self.backView addSubview:_checkmarkGreyImageView]; 40 | } 41 | return _checkmarkGreyImageView; 42 | } 43 | 44 | -(UIImageView*)checkmarkGreenImageView { 45 | if (!_checkmarkGreenImageView) { 46 | _checkmarkGreenImageView = [[UIImageView alloc] initWithFrame:self.checkmarkGreyImageView.bounds]; 47 | [_checkmarkGreenImageView setImage:[UIImage imageNamed:@"CheckmarkGreen"]]; 48 | [_checkmarkGreenImageView setContentMode:UIViewContentModeCenter]; 49 | [self.checkmarkGreyImageView addSubview:_checkmarkGreenImageView]; 50 | } 51 | return _checkmarkGreenImageView; 52 | } 53 | 54 | -(UIImageView*)checkmarkProfileImageView { 55 | if (!_checkmarkProfileImageView) { 56 | _checkmarkProfileImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CheckmarkProfileImage"]]; 57 | [_checkmarkProfileImageView setFrame:CGRectMake(CGRectGetMaxX(self.profileImageView.frame) - 10 - CGRectGetWidth(_checkmarkProfileImageView.frame), CGRectGetMaxY(self.profileImageView.frame) - 10 - CGRectGetHeight(_checkmarkProfileImageView.frame), CGRectGetWidth(_checkmarkProfileImageView.frame), CGRectGetHeight(_checkmarkProfileImageView.frame))]; 58 | } 59 | return _checkmarkProfileImageView; 60 | } 61 | 62 | -(UIImageView*)deleteGreyImageView { 63 | if (!_deleteGreyImageView) { 64 | _deleteGreyImageView = [[UIImageView alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.contentView.frame), 0, CGRectGetHeight(self.frame), CGRectGetHeight(self.frame))]; 65 | [_deleteGreyImageView setImage:[UIImage imageNamed:@"DeleteGrey"]]; 66 | [_deleteGreyImageView setContentMode:UIViewContentModeCenter]; 67 | [self.backView addSubview:_deleteGreyImageView]; 68 | } 69 | return _deleteGreyImageView; 70 | } 71 | 72 | -(UIImageView*)deleteRedImageView { 73 | if (!_deleteRedImageView) { 74 | _deleteRedImageView = [[UIImageView alloc] initWithFrame:self.deleteGreyImageView.bounds]; 75 | [_deleteRedImageView setImage:[UIImage imageNamed:@"DeleteRed"]]; 76 | [_deleteRedImageView setContentMode:UIViewContentModeCenter]; 77 | [self.deleteGreyImageView addSubview:_deleteRedImageView]; 78 | } 79 | return _deleteRedImageView; 80 | } 81 | 82 | -(void)prepareForReuse { 83 | [super prepareForReuse]; 84 | self.textLabel.textColor = [UIColor blackColor]; 85 | self.detailTextLabel.text = nil; 86 | self.detailTextLabel.textColor = [UIColor grayColor]; 87 | [self setUserInteractionEnabled:YES]; 88 | self.imageView.alpha = 1; 89 | self.accessoryView = nil; 90 | self.accessoryType = UITableViewCellAccessoryNone; 91 | [self.contentView setHidden:NO]; 92 | [_checkmarkProfileImageView removeFromSuperview]; 93 | _checkmarkProfileImageView = nil; 94 | [self cleanupBackView]; 95 | } 96 | 97 | -(void)layoutSubviews { 98 | [super layoutSubviews]; 99 | self.textLabel.frame = CGRectMake(CGRectGetMaxX(self.profileImageView.frame) + 10, CGRectGetMinY(self.textLabel.frame), CGRectGetWidth(self.textLabel.frame), CGRectGetHeight(self.textLabel.frame)); 100 | self.detailTextLabel.frame = CGRectMake(CGRectGetMaxX(self.profileImageView.frame) + 10, CGRectGetMinY(self.detailTextLabel.frame), CGRectGetWidth(self.detailTextLabel.frame), CGRectGetHeight(self.detailTextLabel.frame)); 101 | self.separatorInset = UIEdgeInsetsMake(0, CGRectGetMinX(self.textLabel.frame), 0, 0); 102 | } 103 | 104 | -(void)setThumbnail:(UIImage*)image { 105 | [self.profileImageView setImage:image]; 106 | } 107 | 108 | -(void)setFavourite:(BOOL)favourite animated:(BOOL)animated { 109 | self.isFavourite = favourite; 110 | if (animated) { 111 | if (favourite) { 112 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"borderColor"]; 113 | animation.toValue = (id)[UIColor colorWithRed:0.149 green:0.784 blue:0.424 alpha:0.750].CGColor; 114 | animation.fromValue = (id)[UIColor colorWithWhite:0 alpha:0.3].CGColor; 115 | animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 116 | animation.duration = 0.25; 117 | [self.profileImageView.layer addAnimation:animation forKey:@"animateBorderColor"]; 118 | [self.profileImageView.layer setBorderColor:[UIColor colorWithRed:0.149 green:0.784 blue:0.424 alpha:0.750].CGColor]; 119 | [self.checkmarkProfileImageView setAlpha:0]; 120 | [self.profileImageView addSubview:_checkmarkProfileImageView]; 121 | [UIView animateWithDuration:0.25 122 | animations:^{ 123 | [self.checkmarkProfileImageView setAlpha:1]; 124 | }]; 125 | } else { 126 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"borderColor"]; 127 | animation.toValue = (id)[UIColor colorWithWhite:0 alpha:0.3].CGColor; 128 | animation.fromValue = (id)[UIColor colorWithRed:0.149 green:0.784 blue:0.424 alpha:0.750].CGColor; 129 | animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 130 | animation.duration = 0.25; 131 | [self.profileImageView.layer addAnimation:animation forKey:@"animateBorderColor"]; 132 | [self.profileImageView.layer setBorderColor:[UIColor colorWithWhite:0 alpha:0.3].CGColor]; 133 | [UIView animateWithDuration:0.25 134 | animations:^{ 135 | [self.checkmarkProfileImageView setAlpha:0]; 136 | } 137 | completion:^(BOOL finished) { 138 | [_checkmarkProfileImageView removeFromSuperview]; 139 | }]; 140 | } 141 | } else { 142 | if (favourite) { 143 | [self.checkmarkProfileImageView setAlpha:1]; 144 | [self.profileImageView addSubview:_checkmarkProfileImageView]; 145 | [self.profileImageView.layer setBorderColor:[UIColor colorWithRed:0.149 green:0.784 blue:0.424 alpha:0.750].CGColor]; 146 | } else { 147 | [self.checkmarkProfileImageView setAlpha:0]; 148 | [_checkmarkProfileImageView removeFromSuperview]; 149 | [self.profileImageView.layer setBorderColor:[UIColor colorWithWhite:0 alpha:0.3].CGColor]; 150 | } 151 | } 152 | } 153 | 154 | -(void)animateContentViewForPoint:(CGPoint)point velocity:(CGPoint)velocity { 155 | [super animateContentViewForPoint:point velocity:velocity]; 156 | if (point.x > 0) { 157 | // set the checkmark's frame to match the contentView 158 | [self.checkmarkGreyImageView setFrame:CGRectMake(MIN(CGRectGetMinX(self.contentView.frame) - CGRectGetWidth(self.checkmarkGreyImageView.frame), 0), CGRectGetMinY(self.checkmarkGreyImageView.frame), CGRectGetWidth(self.checkmarkGreyImageView.frame), CGRectGetHeight(self.checkmarkGreyImageView.frame))]; 159 | if (point.x >= CGRectGetHeight(self.frame) && self.isFavourite == NO) { 160 | [self.checkmarkGreenImageView setAlpha:1]; 161 | } else if (self.isFavourite == NO) { 162 | [self.checkmarkGreenImageView setAlpha:0]; 163 | } else if (point.x >= CGRectGetHeight(self.frame) && self.isFavourite == YES) { 164 | // already a favourite; animate the green checkmark drop when swiped far enough for the action to kick in when user lets go 165 | if (self.checkmarkGreyImageView.alpha == 1) { 166 | [UIView animateWithDuration:0.25 167 | animations:^{ 168 | CATransform3D rotate = CATransform3DMakeRotation(-0.4, 0, 0, 1); 169 | [self.checkmarkGreenImageView.layer setTransform:CATransform3DTranslate(rotate, -10, 20, 0)]; 170 | [self.checkmarkGreenImageView setAlpha:0]; 171 | }]; 172 | } 173 | } else if (self.isFavourite == YES) { 174 | // already a favourite; but user panned back to a lower value than the action point 175 | CATransform3D rotate = CATransform3DMakeRotation(0, 0, 0, 1); 176 | [self.checkmarkGreenImageView.layer setTransform:CATransform3DTranslate(rotate, 0, 0, 0)]; 177 | [self.checkmarkGreenImageView setAlpha:1]; 178 | } 179 | } else if (point.x < 0) { 180 | // set the X's frame to match the contentView 181 | [self.deleteGreyImageView setFrame:CGRectMake(MAX(CGRectGetMaxX(self.frame) - CGRectGetWidth(self.deleteGreyImageView.frame), CGRectGetMaxX(self.contentView.frame)), CGRectGetMinY(self.deleteGreyImageView.frame), CGRectGetWidth(self.deleteGreyImageView.frame), CGRectGetHeight(self.deleteGreyImageView.frame))]; 182 | if (-point.x >= CGRectGetHeight(self.frame)) { 183 | [self.deleteRedImageView setAlpha:1]; 184 | } else { 185 | [self.deleteRedImageView setAlpha:0]; 186 | } 187 | } 188 | } 189 | 190 | -(void)resetCellFromPoint:(CGPoint)point velocity:(CGPoint)velocity { 191 | [super resetCellFromPoint:point velocity:velocity]; 192 | if (point.x > 0 && point.x <= CGRectGetHeight(self.frame)) { 193 | // user did not swipe far enough, animate the checkmark back with the contentView animation 194 | [UIView animateWithDuration:self.animationDuration 195 | animations:^{ 196 | [self.checkmarkGreyImageView setFrame:CGRectMake(-CGRectGetWidth(self.checkmarkGreyImageView.frame), CGRectGetMinY(self.checkmarkGreyImageView.frame), CGRectGetWidth(self.checkmarkGreyImageView.frame), CGRectGetHeight(self.checkmarkGreyImageView.frame))]; 197 | }]; 198 | } else if (point.x < 0) { 199 | if (-point.x <= CGRectGetHeight(self.frame)) { 200 | // user did not swipe far enough, animate the grey X back with the contentView animation 201 | [UIView animateWithDuration:self.animationDuration 202 | animations:^{ 203 | [self.deleteGreyImageView setFrame:CGRectMake(CGRectGetMaxX(self.frame), CGRectGetMinY(self.deleteGreyImageView.frame), CGRectGetWidth(self.deleteGreyImageView.frame), CGRectGetHeight(self.deleteGreyImageView.frame))]; 204 | }]; 205 | } else { 206 | // user did swipe far enough to meet the delete action requirement, animate the Xs to show selection 207 | [UIView animateWithDuration:self.animationDuration 208 | animations:^{ 209 | [self.deleteGreyImageView.layer setTransform:CATransform3DMakeScale(2, 2, 2)]; 210 | [self.deleteGreyImageView setAlpha:0]; 211 | [self.deleteRedImageView.layer setTransform:CATransform3DMakeScale(2, 2, 2)]; 212 | [self.deleteRedImageView setAlpha:0]; 213 | }]; 214 | } 215 | } 216 | } 217 | 218 | -(void)cleanupBackView { 219 | [super cleanupBackView]; 220 | [_checkmarkGreyImageView removeFromSuperview]; 221 | _checkmarkGreyImageView = nil; 222 | [_checkmarkGreenImageView removeFromSuperview]; 223 | _checkmarkGreenImageView = nil; 224 | [_deleteGreyImageView removeFromSuperview]; 225 | _deleteGreyImageView = nil; 226 | [_deleteRedImageView removeFromSuperview]; 227 | _deleteRedImageView = nil; 228 | } 229 | 230 | @end 231 | -------------------------------------------------------------------------------- /RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 900D15551661ABEC00900B59 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 900D15541661ABEC00900B59 /* UIKit.framework */; }; 11 | 900D15571661ABEC00900B59 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 900D15561661ABEC00900B59 /* Foundation.framework */; }; 12 | 900D15591661ABEC00900B59 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 900D15581661ABEC00900B59 /* CoreGraphics.framework */; }; 13 | 909BDE8E1942A77A000A5BBA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 909BDE8D1942A77A000A5BBA /* Assets.xcassets */; }; 14 | 90B078F11745779400D4E494 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90B078F01745779400D4E494 /* QuartzCore.framework */; }; 15 | 90D524401C1DD26800925FAC /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 90D5243F1C1DD26800925FAC /* Launch Screen.storyboard */; }; 16 | 90FDF47017495387006EF12E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FDF46F17495387006EF12E /* main.m */; }; 17 | 90FDF474174953A3006EF12E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 90FDF472174953A3006EF12E /* InfoPlist.strings */; }; 18 | 90FDF47F174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FDF476174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.m */; }; 19 | 90FDF480174953C2006EF12E /* RMPersonTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FDF478174953C2006EF12E /* RMPersonTableViewCell.m */; }; 20 | 90FDF483174953C2006EF12E /* RMSwipeTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FDF47E174953C2006EF12E /* RMSwipeTableViewController.m */; }; 21 | 90FDF487174955FD006EF12E /* RMSwipeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FDF486174955FD006EF12E /* RMSwipeTableViewCell.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 900D15501661ABEC00900B59 /* RMSwipeTableViewCellDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RMSwipeTableViewCellDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 900D15541661ABEC00900B59 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 27 | 900D15561661ABEC00900B59 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 28 | 900D15581661ABEC00900B59 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 29 | 902B7A4017639B0100477998 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.md; path = ../README.md; sourceTree = SOURCE_ROOT; }; 30 | 902B7A4217639B0600477998 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = SOURCE_ROOT; }; 31 | 909BDE8D1942A77A000A5BBA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = SOURCE_ROOT; }; 32 | 90B078F01745779400D4E494 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 33 | 90D5243F1C1DD26800925FAC /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "Launch Screen.storyboard"; path = "RMSwipeTableViewCellDemo/Launch Screen.storyboard"; sourceTree = SOURCE_ROOT; }; 34 | 90FDF46D17495374006EF12E /* RMSwipeTableViewCellDemo-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "RMSwipeTableViewCellDemo-Info.plist"; path = "RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Info.plist"; sourceTree = SOURCE_ROOT; }; 35 | 90FDF46F17495387006EF12E /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RMSwipeTableViewCellDemo/main.m; sourceTree = SOURCE_ROOT; }; 36 | 90FDF47117495390006EF12E /* RMSwipeTableViewCellDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "RMSwipeTableViewCellDemo-Prefix.pch"; path = "RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Prefix.pch"; sourceTree = SOURCE_ROOT; }; 37 | 90FDF473174953A3006EF12E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = RMSwipeTableViewCellDemo/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; }; 38 | 90FDF475174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RMSwipeTableViewCellDemoAppDelegate.h; path = RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemoAppDelegate.h; sourceTree = SOURCE_ROOT; }; 39 | 90FDF476174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RMSwipeTableViewCellDemoAppDelegate.m; path = RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemoAppDelegate.m; sourceTree = SOURCE_ROOT; }; 40 | 90FDF477174953C2006EF12E /* RMPersonTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RMPersonTableViewCell.h; path = RMSwipeTableViewCellDemo/RMPersonTableViewCell.h; sourceTree = SOURCE_ROOT; }; 41 | 90FDF478174953C2006EF12E /* RMPersonTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RMPersonTableViewCell.m; path = RMSwipeTableViewCellDemo/RMPersonTableViewCell.m; sourceTree = SOURCE_ROOT; }; 42 | 90FDF47D174953C2006EF12E /* RMSwipeTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RMSwipeTableViewController.h; path = RMSwipeTableViewCellDemo/RMSwipeTableViewController.h; sourceTree = SOURCE_ROOT; }; 43 | 90FDF47E174953C2006EF12E /* RMSwipeTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RMSwipeTableViewController.m; path = RMSwipeTableViewCellDemo/RMSwipeTableViewController.m; sourceTree = SOURCE_ROOT; }; 44 | 90FDF485174955FD006EF12E /* RMSwipeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RMSwipeTableViewCell.h; path = ../RMSwipeTableViewCell.h; sourceTree = SOURCE_ROOT; }; 45 | 90FDF486174955FD006EF12E /* RMSwipeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RMSwipeTableViewCell.m; path = ../RMSwipeTableViewCell.m; sourceTree = SOURCE_ROOT; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | 900D154D1661ABEC00900B59 /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | 90B078F11745779400D4E494 /* QuartzCore.framework in Frameworks */, 54 | 900D15551661ABEC00900B59 /* UIKit.framework in Frameworks */, 55 | 900D15571661ABEC00900B59 /* Foundation.framework in Frameworks */, 56 | 900D15591661ABEC00900B59 /* CoreGraphics.framework in Frameworks */, 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | /* End PBXFrameworksBuildPhase section */ 61 | 62 | /* Begin PBXGroup section */ 63 | 900D15451661ABEC00900B59 = { 64 | isa = PBXGroup; 65 | children = ( 66 | 900D155A1661ABEC00900B59 /* RMSwipeTableViewCellDemo */, 67 | 900D15531661ABEC00900B59 /* Frameworks */, 68 | 900D15511661ABEC00900B59 /* Products */, 69 | ); 70 | sourceTree = ""; 71 | }; 72 | 900D15511661ABEC00900B59 /* Products */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 900D15501661ABEC00900B59 /* RMSwipeTableViewCellDemo.app */, 76 | ); 77 | name = Products; 78 | sourceTree = ""; 79 | }; 80 | 900D15531661ABEC00900B59 /* Frameworks */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 90B078F01745779400D4E494 /* QuartzCore.framework */, 84 | 900D15541661ABEC00900B59 /* UIKit.framework */, 85 | 900D15561661ABEC00900B59 /* Foundation.framework */, 86 | 900D15581661ABEC00900B59 /* CoreGraphics.framework */, 87 | ); 88 | name = Frameworks; 89 | sourceTree = ""; 90 | }; 91 | 900D155A1661ABEC00900B59 /* RMSwipeTableViewCellDemo */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 90FDF475174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.h */, 95 | 90FDF476174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.m */, 96 | 909BDE8D1942A77A000A5BBA /* Assets.xcassets */, 97 | 90FDF477174953C2006EF12E /* RMPersonTableViewCell.h */, 98 | 90FDF478174953C2006EF12E /* RMPersonTableViewCell.m */, 99 | 90FDF47D174953C2006EF12E /* RMSwipeTableViewController.h */, 100 | 90FDF47E174953C2006EF12E /* RMSwipeTableViewController.m */, 101 | 90D5243F1C1DD26800925FAC /* Launch Screen.storyboard */, 102 | 90FDF484174953E2006EF12E /* RMSwipeTableViewCell */, 103 | 900D155B1661ABEC00900B59 /* Supporting Files */, 104 | ); 105 | name = RMSwipeTableViewCellDemo; 106 | path = RMSwipeTableView; 107 | sourceTree = ""; 108 | }; 109 | 900D155B1661ABEC00900B59 /* Supporting Files */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 90FDF46F17495387006EF12E /* main.m */, 113 | 90FDF46D17495374006EF12E /* RMSwipeTableViewCellDemo-Info.plist */, 114 | 90FDF47117495390006EF12E /* RMSwipeTableViewCellDemo-Prefix.pch */, 115 | 90FDF472174953A3006EF12E /* InfoPlist.strings */, 116 | ); 117 | name = "Supporting Files"; 118 | sourceTree = ""; 119 | }; 120 | 90FDF484174953E2006EF12E /* RMSwipeTableViewCell */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 90FDF485174955FD006EF12E /* RMSwipeTableViewCell.h */, 124 | 90FDF486174955FD006EF12E /* RMSwipeTableViewCell.m */, 125 | 902B7A4017639B0100477998 /* README.md */, 126 | 902B7A4217639B0600477998 /* LICENSE */, 127 | ); 128 | name = RMSwipeTableViewCell; 129 | sourceTree = ""; 130 | }; 131 | /* End PBXGroup section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | 900D154F1661ABEC00900B59 /* RMSwipeTableViewCellDemo */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = 900D156E1661ABEC00900B59 /* Build configuration list for PBXNativeTarget "RMSwipeTableViewCellDemo" */; 137 | buildPhases = ( 138 | 900D154C1661ABEC00900B59 /* Sources */, 139 | 900D154D1661ABEC00900B59 /* Frameworks */, 140 | 900D154E1661ABEC00900B59 /* Resources */, 141 | ); 142 | buildRules = ( 143 | ); 144 | dependencies = ( 145 | ); 146 | name = RMSwipeTableViewCellDemo; 147 | productName = RMSwipeTableView; 148 | productReference = 900D15501661ABEC00900B59 /* RMSwipeTableViewCellDemo.app */; 149 | productType = "com.apple.product-type.application"; 150 | }; 151 | /* End PBXNativeTarget section */ 152 | 153 | /* Begin PBXProject section */ 154 | 900D15471661ABEC00900B59 /* Project object */ = { 155 | isa = PBXProject; 156 | attributes = { 157 | CLASSPREFIX = RM; 158 | LastUpgradeCheck = 0720; 159 | ORGANIZATIONNAME = "The App Boutique"; 160 | }; 161 | buildConfigurationList = 900D154A1661ABEC00900B59 /* Build configuration list for PBXProject "RMSwipeTableViewCellDemo" */; 162 | compatibilityVersion = "Xcode 3.2"; 163 | developmentRegion = English; 164 | hasScannedForEncodings = 0; 165 | knownRegions = ( 166 | en, 167 | ); 168 | mainGroup = 900D15451661ABEC00900B59; 169 | productRefGroup = 900D15511661ABEC00900B59 /* Products */; 170 | projectDirPath = ""; 171 | projectRoot = ""; 172 | targets = ( 173 | 900D154F1661ABEC00900B59 /* RMSwipeTableViewCellDemo */, 174 | ); 175 | }; 176 | /* End PBXProject section */ 177 | 178 | /* Begin PBXResourcesBuildPhase section */ 179 | 900D154E1661ABEC00900B59 /* Resources */ = { 180 | isa = PBXResourcesBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | 90D524401C1DD26800925FAC /* Launch Screen.storyboard in Resources */, 184 | 909BDE8E1942A77A000A5BBA /* Assets.xcassets in Resources */, 185 | 90FDF474174953A3006EF12E /* InfoPlist.strings in Resources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXResourcesBuildPhase section */ 190 | 191 | /* Begin PBXSourcesBuildPhase section */ 192 | 900D154C1661ABEC00900B59 /* Sources */ = { 193 | isa = PBXSourcesBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | 90FDF47017495387006EF12E /* main.m in Sources */, 197 | 90FDF47F174953C2006EF12E /* RMSwipeTableViewCellDemoAppDelegate.m in Sources */, 198 | 90FDF480174953C2006EF12E /* RMPersonTableViewCell.m in Sources */, 199 | 90FDF483174953C2006EF12E /* RMSwipeTableViewController.m in Sources */, 200 | 90FDF487174955FD006EF12E /* RMSwipeTableViewCell.m in Sources */, 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | }; 204 | /* End PBXSourcesBuildPhase section */ 205 | 206 | /* Begin PBXVariantGroup section */ 207 | 90FDF472174953A3006EF12E /* InfoPlist.strings */ = { 208 | isa = PBXVariantGroup; 209 | children = ( 210 | 90FDF473174953A3006EF12E /* en */, 211 | ); 212 | name = InfoPlist.strings; 213 | sourceTree = ""; 214 | }; 215 | /* End PBXVariantGroup section */ 216 | 217 | /* Begin XCBuildConfiguration section */ 218 | 900D156C1661ABEC00900B59 /* Debug */ = { 219 | isa = XCBuildConfiguration; 220 | buildSettings = { 221 | ALWAYS_SEARCH_USER_PATHS = NO; 222 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 223 | CLANG_CXX_LIBRARY = "libc++"; 224 | CLANG_ENABLE_OBJC_ARC = YES; 225 | CLANG_WARN_EMPTY_BODY = YES; 226 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 227 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 228 | COPY_PHASE_STRIP = NO; 229 | ENABLE_TESTABILITY = YES; 230 | GCC_C_LANGUAGE_STANDARD = gnu99; 231 | GCC_DYNAMIC_NO_PIC = NO; 232 | GCC_OPTIMIZATION_LEVEL = 0; 233 | GCC_PREPROCESSOR_DEFINITIONS = ( 234 | "DEBUG=1", 235 | "$(inherited)", 236 | ); 237 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 238 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 239 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 240 | GCC_WARN_UNUSED_VARIABLE = YES; 241 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 242 | ONLY_ACTIVE_ARCH = YES; 243 | SDKROOT = iphoneos; 244 | }; 245 | name = Debug; 246 | }; 247 | 900D156D1661ABEC00900B59 /* Release */ = { 248 | isa = XCBuildConfiguration; 249 | buildSettings = { 250 | ALWAYS_SEARCH_USER_PATHS = NO; 251 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 252 | CLANG_CXX_LIBRARY = "libc++"; 253 | CLANG_ENABLE_OBJC_ARC = YES; 254 | CLANG_WARN_EMPTY_BODY = YES; 255 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 256 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 257 | COPY_PHASE_STRIP = YES; 258 | GCC_C_LANGUAGE_STANDARD = gnu99; 259 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 260 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 261 | GCC_WARN_UNUSED_VARIABLE = YES; 262 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 263 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 264 | SDKROOT = iphoneos; 265 | VALIDATE_PRODUCT = YES; 266 | }; 267 | name = Release; 268 | }; 269 | 900D156F1661ABEC00900B59 /* Debug */ = { 270 | isa = XCBuildConfiguration; 271 | buildSettings = { 272 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 273 | CLANG_ENABLE_MODULES = YES; 274 | CODE_SIGN_IDENTITY = "iPhone Developer"; 275 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 276 | GCC_PREFIX_HEADER = "RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Prefix.pch"; 277 | INFOPLIST_FILE = "$(SRCROOT)/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Info.plist"; 278 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 279 | PRODUCT_BUNDLE_IDENTIFIER = "com.theappboutique.${PRODUCT_NAME:rfc1034identifier}"; 280 | PRODUCT_NAME = RMSwipeTableViewCellDemo; 281 | WRAPPER_EXTENSION = app; 282 | }; 283 | name = Debug; 284 | }; 285 | 900D15701661ABEC00900B59 /* Release */ = { 286 | isa = XCBuildConfiguration; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CODE_SIGN_IDENTITY = "iPhone Developer"; 291 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 292 | GCC_PREFIX_HEADER = "RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Prefix.pch"; 293 | INFOPLIST_FILE = "$(SRCROOT)/RMSwipeTableViewCellDemo/RMSwipeTableViewCellDemo-Info.plist"; 294 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 295 | PRODUCT_BUNDLE_IDENTIFIER = "com.theappboutique.${PRODUCT_NAME:rfc1034identifier}"; 296 | PRODUCT_NAME = RMSwipeTableViewCellDemo; 297 | WRAPPER_EXTENSION = app; 298 | }; 299 | name = Release; 300 | }; 301 | /* End XCBuildConfiguration section */ 302 | 303 | /* Begin XCConfigurationList section */ 304 | 900D154A1661ABEC00900B59 /* Build configuration list for PBXProject "RMSwipeTableViewCellDemo" */ = { 305 | isa = XCConfigurationList; 306 | buildConfigurations = ( 307 | 900D156C1661ABEC00900B59 /* Debug */, 308 | 900D156D1661ABEC00900B59 /* Release */, 309 | ); 310 | defaultConfigurationIsVisible = 0; 311 | defaultConfigurationName = Release; 312 | }; 313 | 900D156E1661ABEC00900B59 /* Build configuration list for PBXNativeTarget "RMSwipeTableViewCellDemo" */ = { 314 | isa = XCConfigurationList; 315 | buildConfigurations = ( 316 | 900D156F1661ABEC00900B59 /* Debug */, 317 | 900D15701661ABEC00900B59 /* Release */, 318 | ); 319 | defaultConfigurationIsVisible = 0; 320 | defaultConfigurationName = Release; 321 | }; 322 | /* End XCConfigurationList section */ 323 | }; 324 | rootObject = 900D15471661ABEC00900B59 /* Project object */; 325 | } 326 | -------------------------------------------------------------------------------- /RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9044D57C1965D586007AC60E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9044D57B1965D586007AC60E /* Images.xcassets */; }; 11 | 906C15A7176E65E10080E355 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 906C15A6176E65E10080E355 /* UIKit.framework */; }; 12 | 906C15A9176E65E10080E355 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 906C15A8176E65E10080E355 /* Foundation.framework */; }; 13 | 906C15AB176E65E10080E355 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 906C15AA176E65E10080E355 /* CoreGraphics.framework */; }; 14 | 906C15B1176E65E10080E355 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 906C15AF176E65E10080E355 /* InfoPlist.strings */; }; 15 | 906C15B3176E65E10080E355 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 906C15B2176E65E10080E355 /* main.m */; }; 16 | 906C15B7176E65E10080E355 /* RMAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 906C15B6176E65E10080E355 /* RMAppDelegate.m */; }; 17 | 906C15B9176E65E10080E355 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 906C15B8176E65E10080E355 /* Default.png */; }; 18 | 906C15BB176E65E10080E355 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 906C15BA176E65E10080E355 /* Default@2x.png */; }; 19 | 906C15BD176E65E10080E355 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 906C15BC176E65E10080E355 /* Default-568h@2x.png */; }; 20 | 906C15CA176E66D90080E355 /* RMSwipeTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 906C15C7176E66D90080E355 /* RMSwipeTableViewCell.m */; }; 21 | 906C15CD176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 906C15CC176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.m */; }; 22 | 906C15D0176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 906C15CF176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.m */; }; 23 | 906C15D2176E90DE0080E355 /* DeleteButtonBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 906C15D1176E90DE0080E355 /* DeleteButtonBackground.png */; }; 24 | 906C15D6176EA80B0080E355 /* View.xib in Resources */ = {isa = PBXBuildFile; fileRef = 906C15D5176EA80B0080E355 /* View.xib */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXFileReference section */ 28 | 9044D57B1965D586007AC60E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 29 | 906C15A3176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RMSwipeTableViewCelliOS7UIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 906C15A6176E65E10080E355 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 31 | 906C15A8176E65E10080E355 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 32 | 906C15AA176E65E10080E355 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 33 | 906C15AE176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "RMSwipeTableViewCelliOS7UIDemo-Info.plist"; sourceTree = ""; }; 34 | 906C15B0176E65E10080E355 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 35 | 906C15B2176E65E10080E355 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 36 | 906C15B4176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RMSwipeTableViewCelliOS7UIDemo-Prefix.pch"; sourceTree = ""; }; 37 | 906C15B5176E65E10080E355 /* RMAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RMAppDelegate.h; sourceTree = ""; }; 38 | 906C15B6176E65E10080E355 /* RMAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RMAppDelegate.m; sourceTree = ""; }; 39 | 906C15B8176E65E10080E355 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 40 | 906C15BA176E65E10080E355 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 41 | 906C15BC176E65E10080E355 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 42 | 906C15C4176E66D90080E355 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../../LICENSE; sourceTree = ""; }; 43 | 906C15C5176E66D90080E355 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.md; path = ../../README.md; sourceTree = ""; }; 44 | 906C15C6176E66D90080E355 /* RMSwipeTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RMSwipeTableViewCell.h; path = ../../RMSwipeTableViewCell.h; sourceTree = ""; }; 45 | 906C15C7176E66D90080E355 /* RMSwipeTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RMSwipeTableViewCell.m; path = ../../RMSwipeTableViewCell.m; sourceTree = ""; }; 46 | 906C15CB176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMSwipeTableViewCelliOS7UIDemoViewController.h; sourceTree = ""; }; 47 | 906C15CC176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMSwipeTableViewCelliOS7UIDemoViewController.m; sourceTree = ""; }; 48 | 906C15CE176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RMSwipeTableViewCelliOS7UIDemoTableViewCell.h; sourceTree = ""; }; 49 | 906C15CF176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RMSwipeTableViewCelliOS7UIDemoTableViewCell.m; sourceTree = ""; }; 50 | 906C15D1176E90DE0080E355 /* DeleteButtonBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DeleteButtonBackground.png; sourceTree = ""; }; 51 | 906C15D5176EA80B0080E355 /* View.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = View.xib; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 906C15A0176E65E10080E355 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | 906C15A7176E65E10080E355 /* UIKit.framework in Frameworks */, 60 | 906C15A9176E65E10080E355 /* Foundation.framework in Frameworks */, 61 | 906C15AB176E65E10080E355 /* CoreGraphics.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 906C159A176E65E10080E355 = { 69 | isa = PBXGroup; 70 | children = ( 71 | 906C15AC176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo */, 72 | 906C15A5176E65E10080E355 /* Frameworks */, 73 | 906C15A4176E65E10080E355 /* Products */, 74 | ); 75 | sourceTree = ""; 76 | }; 77 | 906C15A4176E65E10080E355 /* Products */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 906C15A3176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo.app */, 81 | ); 82 | name = Products; 83 | sourceTree = ""; 84 | }; 85 | 906C15A5176E65E10080E355 /* Frameworks */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | 906C15A6176E65E10080E355 /* UIKit.framework */, 89 | 906C15A8176E65E10080E355 /* Foundation.framework */, 90 | 906C15AA176E65E10080E355 /* CoreGraphics.framework */, 91 | ); 92 | name = Frameworks; 93 | sourceTree = ""; 94 | }; 95 | 906C15AC176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 906C15B5176E65E10080E355 /* RMAppDelegate.h */, 99 | 906C15B6176E65E10080E355 /* RMAppDelegate.m */, 100 | 906C15CB176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.h */, 101 | 906C15CC176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.m */, 102 | 906C15CE176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.h */, 103 | 906C15CF176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.m */, 104 | 906C15C3176E66BA0080E355 /* RMSwipeTableViewCell */, 105 | 9044D57B1965D586007AC60E /* Images.xcassets */, 106 | 906C15AD176E65E10080E355 /* Supporting Files */, 107 | ); 108 | path = RMSwipeTableViewCelliOS7UIDemo; 109 | sourceTree = ""; 110 | }; 111 | 906C15AD176E65E10080E355 /* Supporting Files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 906C15D1176E90DE0080E355 /* DeleteButtonBackground.png */, 115 | 906C15AE176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo-Info.plist */, 116 | 906C15AF176E65E10080E355 /* InfoPlist.strings */, 117 | 906C15B2176E65E10080E355 /* main.m */, 118 | 906C15D5176EA80B0080E355 /* View.xib */, 119 | 906C15B4176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo-Prefix.pch */, 120 | 906C15B8176E65E10080E355 /* Default.png */, 121 | 906C15BA176E65E10080E355 /* Default@2x.png */, 122 | 906C15BC176E65E10080E355 /* Default-568h@2x.png */, 123 | ); 124 | name = "Supporting Files"; 125 | sourceTree = ""; 126 | }; 127 | 906C15C3176E66BA0080E355 /* RMSwipeTableViewCell */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | 906C15C4176E66D90080E355 /* LICENSE */, 131 | 906C15C5176E66D90080E355 /* README.md */, 132 | 906C15C6176E66D90080E355 /* RMSwipeTableViewCell.h */, 133 | 906C15C7176E66D90080E355 /* RMSwipeTableViewCell.m */, 134 | ); 135 | name = RMSwipeTableViewCell; 136 | sourceTree = ""; 137 | }; 138 | /* End PBXGroup section */ 139 | 140 | /* Begin PBXNativeTarget section */ 141 | 906C15A2176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo */ = { 142 | isa = PBXNativeTarget; 143 | buildConfigurationList = 906C15C0176E65E10080E355 /* Build configuration list for PBXNativeTarget "RMSwipeTableViewCelliOS7UIDemo" */; 144 | buildPhases = ( 145 | 906C159F176E65E10080E355 /* Sources */, 146 | 906C15A0176E65E10080E355 /* Frameworks */, 147 | 906C15A1176E65E10080E355 /* Resources */, 148 | ); 149 | buildRules = ( 150 | ); 151 | dependencies = ( 152 | ); 153 | name = RMSwipeTableViewCelliOS7UIDemo; 154 | productName = RMSwipeTableViewCelliOS7UIDemo; 155 | productReference = 906C15A3176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo.app */; 156 | productType = "com.apple.product-type.application"; 157 | }; 158 | /* End PBXNativeTarget section */ 159 | 160 | /* Begin PBXProject section */ 161 | 906C159B176E65E10080E355 /* Project object */ = { 162 | isa = PBXProject; 163 | attributes = { 164 | CLASSPREFIX = RM; 165 | LastUpgradeCheck = 0460; 166 | ORGANIZATIONNAME = "The App Boutique"; 167 | }; 168 | buildConfigurationList = 906C159E176E65E10080E355 /* Build configuration list for PBXProject "RMSwipeTableViewCelliOS7UIDemo" */; 169 | compatibilityVersion = "Xcode 3.2"; 170 | developmentRegion = English; 171 | hasScannedForEncodings = 0; 172 | knownRegions = ( 173 | en, 174 | ); 175 | mainGroup = 906C159A176E65E10080E355; 176 | productRefGroup = 906C15A4176E65E10080E355 /* Products */; 177 | projectDirPath = ""; 178 | projectRoot = ""; 179 | targets = ( 180 | 906C15A2176E65E10080E355 /* RMSwipeTableViewCelliOS7UIDemo */, 181 | ); 182 | }; 183 | /* End PBXProject section */ 184 | 185 | /* Begin PBXResourcesBuildPhase section */ 186 | 906C15A1176E65E10080E355 /* Resources */ = { 187 | isa = PBXResourcesBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | 906C15B1176E65E10080E355 /* InfoPlist.strings in Resources */, 191 | 906C15B9176E65E10080E355 /* Default.png in Resources */, 192 | 9044D57C1965D586007AC60E /* Images.xcassets in Resources */, 193 | 906C15BB176E65E10080E355 /* Default@2x.png in Resources */, 194 | 906C15BD176E65E10080E355 /* Default-568h@2x.png in Resources */, 195 | 906C15D2176E90DE0080E355 /* DeleteButtonBackground.png in Resources */, 196 | 906C15D6176EA80B0080E355 /* View.xib in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXResourcesBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 906C159F176E65E10080E355 /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 906C15B3176E65E10080E355 /* main.m in Sources */, 208 | 906C15B7176E65E10080E355 /* RMAppDelegate.m in Sources */, 209 | 906C15CA176E66D90080E355 /* RMSwipeTableViewCell.m in Sources */, 210 | 906C15CD176E6CCC0080E355 /* RMSwipeTableViewCelliOS7UIDemoViewController.m in Sources */, 211 | 906C15D0176E6EF80080E355 /* RMSwipeTableViewCelliOS7UIDemoTableViewCell.m in Sources */, 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | }; 215 | /* End PBXSourcesBuildPhase section */ 216 | 217 | /* Begin PBXVariantGroup section */ 218 | 906C15AF176E65E10080E355 /* InfoPlist.strings */ = { 219 | isa = PBXVariantGroup; 220 | children = ( 221 | 906C15B0176E65E10080E355 /* en */, 222 | ); 223 | name = InfoPlist.strings; 224 | sourceTree = ""; 225 | }; 226 | /* End PBXVariantGroup section */ 227 | 228 | /* Begin XCBuildConfiguration section */ 229 | 906C15BE176E65E10080E355 /* Debug */ = { 230 | isa = XCBuildConfiguration; 231 | buildSettings = { 232 | ALWAYS_SEARCH_USER_PATHS = NO; 233 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 234 | CLANG_CXX_LIBRARY = "libc++"; 235 | CLANG_ENABLE_OBJC_ARC = YES; 236 | CLANG_WARN_CONSTANT_CONVERSION = YES; 237 | CLANG_WARN_EMPTY_BODY = YES; 238 | CLANG_WARN_ENUM_CONVERSION = YES; 239 | CLANG_WARN_INT_CONVERSION = YES; 240 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 241 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 242 | COPY_PHASE_STRIP = NO; 243 | GCC_C_LANGUAGE_STANDARD = gnu99; 244 | GCC_DYNAMIC_NO_PIC = NO; 245 | GCC_OPTIMIZATION_LEVEL = 0; 246 | GCC_PREPROCESSOR_DEFINITIONS = ( 247 | "DEBUG=1", 248 | "$(inherited)", 249 | ); 250 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 251 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 252 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 253 | GCC_WARN_UNUSED_VARIABLE = YES; 254 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 255 | ONLY_ACTIVE_ARCH = YES; 256 | SDKROOT = iphoneos; 257 | }; 258 | name = Debug; 259 | }; 260 | 906C15BF176E65E10080E355 /* Release */ = { 261 | isa = XCBuildConfiguration; 262 | buildSettings = { 263 | ALWAYS_SEARCH_USER_PATHS = NO; 264 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 265 | CLANG_CXX_LIBRARY = "libc++"; 266 | CLANG_ENABLE_OBJC_ARC = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_EMPTY_BODY = YES; 269 | CLANG_WARN_ENUM_CONVERSION = YES; 270 | CLANG_WARN_INT_CONVERSION = YES; 271 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 272 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 273 | COPY_PHASE_STRIP = YES; 274 | GCC_C_LANGUAGE_STANDARD = gnu99; 275 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 276 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 277 | GCC_WARN_UNUSED_VARIABLE = YES; 278 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 279 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 280 | SDKROOT = iphoneos; 281 | VALIDATE_PRODUCT = YES; 282 | }; 283 | name = Release; 284 | }; 285 | 906C15C1176E65E10080E355 /* Debug */ = { 286 | isa = XCBuildConfiguration; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 290 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 291 | GCC_PREFIX_HEADER = "RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Prefix.pch"; 292 | INFOPLIST_FILE = "RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Info.plist"; 293 | PRODUCT_NAME = "$(TARGET_NAME)"; 294 | WRAPPER_EXTENSION = app; 295 | }; 296 | name = Debug; 297 | }; 298 | 906C15C2176E65E10080E355 /* Release */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 302 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 303 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 304 | GCC_PREFIX_HEADER = "RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Prefix.pch"; 305 | INFOPLIST_FILE = "RMSwipeTableViewCelliOS7UIDemo/RMSwipeTableViewCelliOS7UIDemo-Info.plist"; 306 | PRODUCT_NAME = "$(TARGET_NAME)"; 307 | WRAPPER_EXTENSION = app; 308 | }; 309 | name = Release; 310 | }; 311 | /* End XCBuildConfiguration section */ 312 | 313 | /* Begin XCConfigurationList section */ 314 | 906C159E176E65E10080E355 /* Build configuration list for PBXProject "RMSwipeTableViewCelliOS7UIDemo" */ = { 315 | isa = XCConfigurationList; 316 | buildConfigurations = ( 317 | 906C15BE176E65E10080E355 /* Debug */, 318 | 906C15BF176E65E10080E355 /* Release */, 319 | ); 320 | defaultConfigurationIsVisible = 0; 321 | defaultConfigurationName = Release; 322 | }; 323 | 906C15C0176E65E10080E355 /* Build configuration list for PBXNativeTarget "RMSwipeTableViewCelliOS7UIDemo" */ = { 324 | isa = XCConfigurationList; 325 | buildConfigurations = ( 326 | 906C15C1176E65E10080E355 /* Debug */, 327 | 906C15C2176E65E10080E355 /* Release */, 328 | ); 329 | defaultConfigurationIsVisible = 0; 330 | defaultConfigurationName = Release; 331 | }; 332 | /* End XCConfigurationList section */ 333 | }; 334 | rootObject = 906C159B176E65E10080E355 /* Project object */; 335 | } 336 | --------------------------------------------------------------------------------