├── multFunCell.gif ├── XZMultiFunctionCell.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── xiazer.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── XZMultiFunctionCell.xccheckout ├── xcuserdata │ └── xiazer.xcuserdatad │ │ ├── xcschemes │ │ ├── xcschememanagement.plist │ │ └── XZMultiFunctionCell.xcscheme │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── project.pbxproj ├── XZMultiFunctionCell ├── ViewController.h ├── HomeViewCell.h ├── AppDelegate.h ├── main.m ├── MultiFunctionCell │ ├── OverLayView.h │ ├── OverLayView.m │ ├── MultiFunctionTableView.h │ ├── MultiFunctionCell.h │ ├── MultiFunctionTableView.m │ └── MultiFunctionCell.m ├── HomeViewCell.m ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib ├── AppDelegate.m └── ViewController.m ├── MultiFunctionCell.podspec ├── XZMultiFunctionCellTests ├── Info.plist └── XZMultiFunctionCellTests.m └── README.md /multFunCell.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kingundertree/MultiFunctionCell/HEAD/multFunCell.gif -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/project.xcworkspace/xcuserdata/xiazer.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kingundertree/MultiFunctionCell/HEAD/XZMultiFunctionCell.xcodeproj/project.xcworkspace/xcuserdata/xiazer.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /XZMultiFunctionCell/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/HomeViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewCell.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "MultiFunctionCell.h" 10 | 11 | @interface HomeViewCell : MultiFunctionCell 12 | 13 | - (void)configCell:(id)model index:(NSIndexPath*)index; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/OverLayView.h: -------------------------------------------------------------------------------- 1 | // 2 | // OverLayView.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class OverLayView; 12 | 13 | @protocol OverLayViewDelegate 14 | -(UIView *)overLayView:(OverLayView *)view didHitPoint:(CGPoint)didHitPoint withEvent:(UIEvent *)withEvent; 15 | @end 16 | 17 | 18 | @interface OverLayView : UIView 19 | @property(nonatomic, assign) id delegate; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /MultiFunctionCell.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "MultiFunctionCell" 4 | s.version = "0.0.1" 5 | s.summary = "" 6 | 7 | s.description = "" 8 | 9 | s.homepage = "https://github.com/kingundertree/MultiFunctionCell" 10 | 11 | s.license = "MIT (example)" 12 | s.author = { "徐山" => "kingundertree@163.com" } 13 | s.source = { :git => "https://github.com/kingundertree/MultiFunctionCell.git" } 14 | 15 | s.source_files = 'MultiFunctionCell', 'XZMultiFunctionCell/MultiFunctionCell/*.{h,m}' 16 | 17 | 18 | end 19 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/xcuserdata/xiazer.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | XZMultiFunctionCell.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | F8148CDE1A5A6E61004809E2 16 | 17 | primary 18 | 19 | 20 | F8148CF71A5A6E61004809E2 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/HomeViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewCell.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "HomeViewCell.h" 10 | 11 | //定义屏幕高度 12 | #define ScreenHeight [UIScreen mainScreen].bounds.size.height 13 | //定义屏幕宽度 14 | #define ScreenWidth [UIScreen mainScreen].bounds.size.width 15 | 16 | @implementation HomeViewCell 17 | 18 | - (void)configCell:(id)model index:(NSIndexPath*)index{ 19 | UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, 80)]; 20 | lab.backgroundColor = [UIColor whiteColor]; 21 | [self.cellContentView addSubview:lab]; 22 | 23 | lab.text = [NSString stringWithFormat:@" MultiFunctionCell---->> %ld",(long)index.row]; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "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 | } -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/OverLayView.m: -------------------------------------------------------------------------------- 1 | // 2 | // OverLayView.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "OverLayView.h" 10 | 11 | @implementation OverLayView 12 | @synthesize delegate; 13 | 14 | - (id)initWithFrame:(CGRect)frame 15 | { 16 | self = [super initWithFrame:frame]; 17 | if (self) { 18 | // Initialization code 19 | self.backgroundColor = [UIColor clearColor]; 20 | } 21 | return self; 22 | } 23 | 24 | -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ 25 | if (self.delegate) { 26 | return [self.delegate overLayView:self didHitPoint:point withEvent:event]; 27 | } else { 28 | return nil; 29 | } 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/MultiFunctionTableView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MultiFunctionTableView.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "OverLayView.h" 11 | #import "MultiFunctionCell.h" 12 | 13 | @protocol MultiFunctionTableViewDelegate 14 | - (void)returnCellMenuIndex:(NSIndexPath *)indexPath menuIndexNum:(NSInteger)menuIndexNum isLeftMenu:(BOOL)isLeftMenu; 15 | @end 16 | 17 | @interface MultiFunctionTableView : UITableView 18 | 19 | @property (nonatomic, assign) id multiTableDelegate; 20 | - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style; 21 | - (void)hideMenuActive:(BOOL)aninated; 22 | @end 23 | -------------------------------------------------------------------------------- /XZMultiFunctionCellTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | xiazer.com.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /XZMultiFunctionCellTests/XZMultiFunctionCellTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // XZMultiFunctionCellTests.m 3 | // XZMultiFunctionCellTests 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface XZMultiFunctionCellTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation XZMultiFunctionCellTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | xiazer.com.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/xcuserdata/xiazer.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 20 | 21 | 22 | 24 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/project.xcworkspace/xcshareddata/XZMultiFunctionCell.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | F6E7DDCE-97D3-4F8F-A420-883EA0301DBE 9 | IDESourceControlProjectName 10 | XZMultiFunctionCell 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | B42B130DA2F3016C3314A9E28FA7DE36DAFD0031 14 | https://github.com/kingundertree/MultiFunctionCell.git 15 | 16 | IDESourceControlProjectPath 17 | XZMultiFunctionCell.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | B42B130DA2F3016C3314A9E28FA7DE36DAFD0031 21 | ../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/kingundertree/MultiFunctionCell.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | B42B130DA2F3016C3314A9E28FA7DE36DAFD0031 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | B42B130DA2F3016C3314A9E28FA7DE36DAFD0031 36 | IDESourceControlWCCName 37 | XZMultiFunctionCell 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ###先上效果图 2 | ![Mou icon](https://raw.githubusercontent.com/kingundertree/MultiFunctionCell/master/multFunCell.gif) 3 | 4 | ###github地址 5 | 6 | https://github.com/kingundertree/MultiFunctionCell 7 | 8 | ###功能 9 | 1. 支持定制UITableViewCell菜单,通过滑动UITableViewCell显示左右侧菜单选项 10 | 2. 支持cell的重用,以及单个cell的菜单定制 11 | 12 | ###实现机制 13 | 1. 定制UITableViewCell,在UITableViewCell.contentView上添加UIScrollView作为主视图,并绑定UIPanGestureRecognizer手势 14 | 2. 定义左右菜单视图,置于UIScrollView之下 15 | 3. 通过UIPanGestureRecognizer的事件控制UIScrollView的frame实现菜单的显示和隐藏 16 | 4. 定制UITableView,通过OverLayViewDelegate控制罩层的显示和隐藏 17 | 18 | ###使用方法 19 | 20 | ##### UITableView 21 | 继承MultiFunctionTableView 22 | 23 | self.tableList = [[MultiFunctionTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 24 | self.tableList.delegate = self; 25 | self.tableList.dataSource = self; 26 | self.tableList.rowHeight = 80; 27 | [self.view addSubview:self.tableList]; 28 | 29 | Datasource的cellForRow方法中实现 30 | HomeViewCell继承MultiFunctionCell即可,并设置cell.cellActionDelegate = self.tableList即可。其他都不用care了 31 | 32 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 33 | static NSString *cellIdentify = @"cell"; 34 | HomeViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentify]; 35 | if (!cell) { 36 | cell = [[HomeViewCell alloc] initWithStyle:UITableViewCellStyleDefault 37 | reuseIdentifier:cellIdentify 38 | containingTableView:tableView 39 | leftUtilityButtons:@[@"left1"] 40 | rightUtilityButtons:@[@"right1",@"right2"]]; 41 | cell.cellActionDelegate = self.tableList; 42 | [cell configCell:nil index:indexPath]; 43 | } 44 | 45 | 46 | return cell; 47 | } -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/MultiFunctionCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // MultiFunctionCell.h 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class MultiFunctionCell; 12 | 13 | typedef NS_ENUM(NSInteger, MultiFunctionCellType) { 14 | MultiFunctionCellTypeForNormal = 0, // 常见状态,cell没有任何移动 15 | MultiFunctionCellTypeForLeftMenu = 1, // 左侧menu可见 16 | MultiFunctionCellTypeForRightMenu = 2, // 右侧menu可见 17 | }; 18 | 19 | 20 | @protocol MultiFunctionCellActionDelegate 21 | - (void)tableMenuDidShowInCell:(MultiFunctionCell *)cell; 22 | - (void)tableMenuWillShowInCell:(MultiFunctionCell *)cell; 23 | - (void)tableMenuDidHideInCell:(MultiFunctionCell *)cell; 24 | - (void)tableMenuWillHideInCell:(MultiFunctionCell *)cell; 25 | - (void)deleteCell:(MultiFunctionCell *)cell; 26 | - (void)cellMenuIndex:(NSIndexPath *)indexPath menuIndexNum:(NSInteger)menuIndexNum isLeftMenu:(BOOL)isLeftMenu; 27 | @end 28 | 29 | 30 | @interface MultiFunctionCell : UITableViewCell 31 | @property (nonatomic, assign) id cellActionDelegate; 32 | 33 | @property (nonatomic, strong) NSArray *leftMenus; 34 | @property (nonatomic, strong) NSArray *rightMenus; 35 | @property (nonatomic, assign) float cellHeight; 36 | @property (nonatomic, strong) UIView *cellContentView; 37 | @property (nonatomic, assign) MultiFunctionCellType cellStauts; 38 | @property (nonatomic, strong) UIView *leftMenuView; 39 | @property (nonatomic, strong) UIView *rightMenuView; 40 | 41 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier containingTableView:(UITableView *)containingTableView leftUtilityButtons:(NSArray *)leftUtilityButtons rightUtilityButtons:(NSArray *)rightUtilityButtons; 42 | 43 | - (void)setMenuHidden:(BOOL)hidden animated:(BOOL)animated completionHandler:(void (^)(void))completionHandler; 44 | @end 45 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | - (void)applicationWillResignActive:(UIApplication *)application { 24 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 25 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 26 | } 27 | 28 | - (void)applicationDidEnterBackground:(UIApplication *)application { 29 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 30 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 31 | } 32 | 33 | - (void)applicationWillEnterForeground:(UIApplication *)application { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application { 38 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application { 42 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "MultiFunctionTableView.h" 11 | #import "HomeViewCell.h" 12 | 13 | @interface ViewController () 14 | @property (nonatomic, strong) MultiFunctionTableView *tableList; 15 | @end 16 | 17 | @implementation ViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | self.title = @"多功能cell"; 22 | 23 | self.tableList = [[MultiFunctionTableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 24 | self.tableList.delegate = self; 25 | self.tableList.dataSource = self; 26 | self.tableList.multiTableDelegate = self; 27 | self.tableList.rowHeight = 80; 28 | [self.view addSubview:self.tableList]; 29 | } 30 | 31 | #pragma mark 32 | #pragma mark - UITableViewDelegate 33 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 34 | return tableView.rowHeight; 35 | } 36 | 37 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 38 | return 10; 39 | } 40 | 41 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 42 | static NSString *cellIdentify = @"cell"; 43 | HomeViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentify]; 44 | if (!cell) { 45 | cell = [[HomeViewCell alloc] initWithStyle:UITableViewCellStyleDefault 46 | reuseIdentifier:cellIdentify 47 | containingTableView:tableView 48 | leftUtilityButtons:@[@"left1"] 49 | rightUtilityButtons:@[@"right1",@"right2"]]; 50 | cell.cellActionDelegate = self.tableList; 51 | [cell configCell:nil index:indexPath]; 52 | } 53 | 54 | 55 | return cell; 56 | } 57 | 58 | #pragma mark - MultiFunctionTableViewDelegate 59 | - (void)returnCellMenuIndex:(NSIndexPath *)indexPath menuIndexNum:(NSInteger)menuIndexNum isLeftMenu:(BOOL)isLeftMenu { 60 | 61 | } 62 | 63 | 64 | - (void)didReceiveMemoryWarning { 65 | [super didReceiveMemoryWarning]; 66 | // Dispose of any resources that can be recreated. 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/MultiFunctionTableView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MultiFunctionTableView.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "MultiFunctionTableView.h" 10 | 11 | @interface MultiFunctionTableView () 12 | @property (nonatomic, strong) MultiFunctionCell *activeCell; 13 | @property (nonatomic, strong) OverLayView *overLayView; 14 | @property (nonatomic, assign) BOOL isCellMenuOn; 15 | @property (nonatomic, assign) NSInteger cellIndex; 16 | 17 | @end 18 | 19 | @implementation MultiFunctionTableView 20 | 21 | - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style{ 22 | self = [super initWithFrame:frame style:style]; 23 | if (self) { 24 | 25 | } 26 | 27 | return self; 28 | } 29 | 30 | #pragma mark - OverLayViewDelegate 31 | - (UIView *)overLayView:(OverLayView *)view didHitPoint:(CGPoint)didHitPoint withEvent:(UIEvent *)withEvent{ 32 | BOOL shoudReceivePointTouch = YES; 33 | 34 | CGPoint location = [self convertPoint:didHitPoint fromView:view]; 35 | 36 | CGRect rect; 37 | if (self.activeCell.cellStauts == MultiFunctionCellTypeForLeftMenu) { 38 | rect = [self.activeCell convertRect:self.activeCell.leftMenuView.frame toView:self]; 39 | } else if (self.activeCell.cellStauts == MultiFunctionCellTypeForRightMenu) { 40 | rect = [self.activeCell convertRect:self.activeCell.rightMenuView.frame toView:self]; 41 | } 42 | shoudReceivePointTouch = CGRectContainsPoint(rect, location); 43 | if (!shoudReceivePointTouch) { 44 | // 回复cell 菜单状态 45 | [self hideMenuActive:YES]; 46 | } 47 | 48 | return (shoudReceivePointTouch) ? [self.activeCell hitTest:didHitPoint withEvent:withEvent] : view; 49 | } 50 | 51 | - (void)hideMenuActive:(BOOL)aninated{ 52 | __block MultiFunctionTableView *this = self; 53 | [self.activeCell setMenuHidden:YES animated:YES completionHandler:^{ 54 | this.isCellMenuOn = NO; 55 | }]; 56 | } 57 | #pragma mark MultiFunctionCellActionDelegate 58 | - (void)tableMenuDidShowInCell:(MultiFunctionCell *)cell{ 59 | self.cellIndex = [self indexPathForCell:cell].row; 60 | self.isCellMenuOn = YES; 61 | self.activeCell = cell; 62 | } 63 | - (void)tableMenuWillShowInCell:(MultiFunctionCell *)cell{ 64 | self.cellIndex = [self indexPathForCell:cell].row; 65 | self.isCellMenuOn = YES; 66 | self.activeCell = cell; 67 | } 68 | - (void)tableMenuDidHideInCell:(MultiFunctionCell *)cell{ 69 | self.cellIndex = -1; 70 | self.isCellMenuOn = NO; 71 | self.activeCell = nil; 72 | } 73 | - (void)tableMenuWillHideInCell:(MultiFunctionCell *)cell{ 74 | self.cellIndex = -1; 75 | self.isCellMenuOn = NO; 76 | self.activeCell = nil; 77 | } 78 | 79 | - (void)cellMenuIndex:(NSIndexPath *)indexPath menuIndexNum:(NSInteger)menuIndexNum isLeftMenu:(BOOL)isLeftMenu; 80 | { 81 | NSLog(@"你选择了第 %ld 行第 %ld 个菜单",(long)indexPath.row+1,(long)menuIndexNum+1); 82 | if (self.multiTableDelegate && [self.multiTableDelegate respondsToSelector:@selector(returnCellMenuIndex:menuIndexNum:isLeftMenu:)]) { 83 | [self.multiTableDelegate returnCellMenuIndex:indexPath menuIndexNum:menuIndexNum isLeftMenu:isLeftMenu]; 84 | } 85 | } 86 | 87 | - (void)deleteCell:(MultiFunctionCell *)cell{ 88 | } 89 | 90 | 91 | #pragma mark UITableView delegate 92 | - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 93 | { 94 | if ([tableView cellForRowAtIndexPath:indexPath] == self.activeCell) { 95 | [self hideMenuActive:YES]; 96 | return NO; 97 | } 98 | return YES; 99 | } 100 | 101 | - (void)setIsCellMenuOn:(BOOL)isCellMenuOn{ 102 | if (_isCellMenuOn != isCellMenuOn) { 103 | _isCellMenuOn = isCellMenuOn; 104 | } 105 | 106 | if (_isCellMenuOn) { 107 | if (!self.overLayView) { 108 | self.overLayView = [[OverLayView alloc] initWithFrame:self.bounds]; 109 | self.overLayView.delegate = self; 110 | [self addSubview:self.overLayView]; 111 | } 112 | }else{ 113 | self.activeCell = nil; 114 | [_overLayView removeFromSuperview]; 115 | _overLayView = nil; 116 | } 117 | } 118 | 119 | 120 | 121 | @end 122 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/xcuserdata/xiazer.xcuserdatad/xcschemes/XZMultiFunctionCell.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /XZMultiFunctionCell/MultiFunctionCell/MultiFunctionCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // MultiFunctionCell.m 3 | // XZMultiFunctionCell 4 | // 5 | // Created by xiazer on 15/1/5. 6 | // Copyright (c) 2015年 xiazer. All rights reserved. 7 | // 8 | 9 | #import "MultiFunctionCell.h" 10 | 11 | //定义屏幕高度 12 | #define ScreenHeight [UIScreen mainScreen].bounds.size.height 13 | //定义屏幕宽度 14 | #define ScreenWidth [UIScreen mainScreen].bounds.size.width 15 | 16 | #define CellMenuWidth 80.0 17 | 18 | NSUInteger DeviceSystemMajorVersion() 19 | { 20 | static NSUInteger _deviceSystemMajorVersion = -1; 21 | static dispatch_once_t onceToken; 22 | dispatch_once(&onceToken, ^{ 23 | _deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue]; 24 | }); 25 | return _deviceSystemMajorVersion; 26 | } 27 | #define IsSystemVersionOverSeven (DeviceSystemMajorVersion() >= 7) 28 | 29 | 30 | @interface MultiFunctionCell () 31 | @property (nonatomic, assign) float startX; 32 | @property (nonatomic, assign) float cellStartX; 33 | @property (nonatomic, strong) UIView *baseCellView; 34 | @property (nonatomic, assign) float leftMargin; 35 | @property (nonatomic, assign) float rightMargin; 36 | @property (nonatomic, assign) BOOL isMoving; 37 | @property (nonatomic, strong) UITableView *containTableView; 38 | @end 39 | 40 | @implementation MultiFunctionCell 41 | 42 | - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier containingTableView:(UITableView *)containingTableView leftUtilityButtons:(NSArray *)leftUtilityButtons rightUtilityButtons:(NSArray *)rightUtilityButtons { 43 | 44 | self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 45 | 46 | if (self) { 47 | self.selectionStyle = UITableViewCellSelectionStyleNone; 48 | self.cellHeight = containingTableView.rowHeight; 49 | self.containTableView = containingTableView; 50 | 51 | [self initUI]; 52 | self.leftMenus = [NSArray arrayWithArray:leftUtilityButtons]; 53 | self.rightMenus = [NSArray arrayWithArray:rightUtilityButtons]; 54 | [self addCellView]; 55 | } 56 | return self; 57 | } 58 | 59 | - (void)initUI{ 60 | self.baseCellView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, self.cellHeight)]; 61 | self.baseCellView.backgroundColor = [UIColor blackColor]; 62 | [self.contentView addSubview:self.baseCellView]; 63 | } 64 | 65 | - (void)addCellView{ 66 | self.leftMargin = 10+self.leftMenus.count*CellMenuWidth; 67 | self.rightMargin = 0-10-self.rightMenus.count*CellMenuWidth; 68 | 69 | self.cellContentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, self.cellHeight)]; 70 | self.cellContentView.backgroundColor = [UIColor clearColor]; 71 | [self.baseCellView addSubview:self.cellContentView]; 72 | 73 | UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(cellPanGes:)]; 74 | panGes.delegate = self; 75 | panGes.delaysTouchesBegan = YES; 76 | panGes.cancelsTouchesInView = NO; 77 | [self.cellContentView addGestureRecognizer:panGes]; 78 | } 79 | 80 | - (void)setLeftMenus:(NSArray *)leftMenus{ 81 | _leftMenus = leftMenus; 82 | 83 | if (_leftMenus.count > 0) { 84 | self.leftMenuView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CellMenuWidth*_leftMenus.count, self.cellHeight)]; 85 | self.leftMenuView.backgroundColor = [UIColor clearColor]; 86 | [self.baseCellView addSubview:self.leftMenuView]; 87 | 88 | for (NSInteger i = 0; i < _leftMenus.count; i++) { 89 | CGRect frame = CGRectMake(CellMenuWidth*i, 0, CellMenuWidth, self.cellHeight); 90 | UIButton *menuBtn = [self createBtn:frame title:_leftMenus[i] titleColor:[UIColor blueColor] bgcolor:[UIColor greenColor] menuTag:100+i]; 91 | [self.leftMenuView addSubview:menuBtn]; 92 | } 93 | } 94 | } 95 | 96 | - (void)setRightMenus:(NSArray *)rightMenus{ 97 | _rightMenus = rightMenus; 98 | 99 | if (_rightMenus.count > 0) { 100 | self.rightMenuView = [[UIView alloc] initWithFrame:CGRectMake(ScreenWidth-CellMenuWidth*_rightMenus.count, 0, CellMenuWidth*_rightMenus.count, self.cellHeight)]; 101 | self.rightMenuView.backgroundColor = [UIColor clearColor]; 102 | [self.baseCellView addSubview:self.rightMenuView]; 103 | 104 | for (NSInteger i = 0; i < _rightMenus.count; i++) { 105 | CGRect frame = CGRectMake(CellMenuWidth*i, 0, CellMenuWidth, self.cellHeight); 106 | UIButton *menuBtn = [self createBtn:frame title:_rightMenus[i] titleColor:[UIColor whiteColor] bgcolor:[UIColor redColor] menuTag:200+i]; 107 | [self.rightMenuView addSubview:menuBtn]; 108 | } 109 | } 110 | } 111 | 112 | #pragma mark * UIPanGestureRecognizer delegate 113 | - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ 114 | if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 115 | CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self]; 116 | return fabs(translation.x) > fabs(translation.y); 117 | } 118 | return YES; 119 | } 120 | 121 | - (void)cellPanGes:(UIPanGestureRecognizer *)panGes{ 122 | if (self.isMoving) { 123 | return; 124 | } 125 | 126 | if (self.selected) { 127 | [self setSelected:NO animated:NO]; 128 | } 129 | CGPoint pointer = [panGes locationInView:self.contentView]; 130 | if (panGes.state == UIGestureRecognizerStateBegan) { 131 | self.startX = pointer.x; 132 | self.cellStartX = self.cellContentView.frame.origin.x; 133 | }else if (panGes.state == UIGestureRecognizerStateChanged){ 134 | if (self.cellActionDelegate && [self.cellActionDelegate respondsToSelector:@selector(tableMenuWillHideInCell:)]) { 135 | [self.cellActionDelegate tableMenuWillShowInCell:self]; 136 | } 137 | [self cellViewMoveToX:self.cellStartX + pointer.x - self.startX]; 138 | }else if (panGes.state == UIGestureRecognizerStateCancelled || panGes.state == UIGestureRecognizerStateEnded){ 139 | [self resetCellContentView]; 140 | return; 141 | } 142 | } 143 | 144 | - (void)cellViewMoveToX:(float)x{ 145 | NSLog(@"nowX-->>%f",x); 146 | if (x >= self.leftMargin) { 147 | return; 148 | } else if (x <= self.rightMargin) { 149 | return; 150 | } 151 | 152 | self.cellContentView.frame = CGRectMake(x, 0, ScreenWidth, self.cellHeight); 153 | } 154 | 155 | - (void)resetCellContentView{ 156 | float cellX = self.cellContentView.frame.origin.x; 157 | __block MultiFunctionCell *this = self; 158 | if (cellX <= 10 && cellX >= -10) { 159 | self.isMoving = YES; 160 | 161 | if (IsSystemVersionOverSeven) { 162 | [UIView animateWithDuration:0.4f delay:0.0f usingSpringWithDamping:1.0f initialSpringVelocity:0.0f options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 163 | this.cellContentView.frame = CGRectMake(0, 0, ScreenWidth, this.cellHeight); 164 | } completion:^(BOOL finished) { 165 | self.isMoving = NO; 166 | this.cellStauts = MultiFunctionCellTypeForNormal; 167 | [self.cellActionDelegate tableMenuDidHideInCell:self]; 168 | }]; 169 | } else { 170 | [UIView animateWithDuration:0.4 animations:^{ 171 | this.cellContentView.frame = CGRectMake(0, 0, ScreenWidth, this.cellHeight); 172 | } completion:^(BOOL finished) { 173 | self.isMoving = NO; 174 | this.cellStauts = MultiFunctionCellTypeForNormal; 175 | [self.cellActionDelegate tableMenuDidHideInCell:self]; 176 | }]; 177 | } 178 | } else if ( cellX > 10) { 179 | self.isMoving = YES; 180 | if (IsSystemVersionOverSeven >= 7.0) { 181 | [UIView animateWithDuration:0.4f delay:0.0f usingSpringWithDamping:1.0f initialSpringVelocity:0.0f options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 182 | this.cellContentView.frame = CGRectMake(self.leftMenus.count*CellMenuWidth, 0, ScreenWidth, this.cellHeight); 183 | } completion:^(BOOL finished) { 184 | self.isMoving = NO; 185 | this.cellStauts = MultiFunctionCellTypeForLeftMenu; 186 | [self.cellActionDelegate tableMenuDidShowInCell:self]; 187 | }]; 188 | } else { 189 | [UIView animateWithDuration:0.4 animations:^{ 190 | this.cellContentView.frame = CGRectMake(self.leftMenus.count*CellMenuWidth, 0, ScreenWidth, this.cellHeight); 191 | } completion:^(BOOL finished) { 192 | self.isMoving = NO; 193 | this.cellStauts = MultiFunctionCellTypeForLeftMenu; 194 | [self.cellActionDelegate tableMenuDidShowInCell:self]; 195 | }]; 196 | } 197 | } else if (cellX < -10) { 198 | self.isMoving = YES; 199 | 200 | if (IsSystemVersionOverSeven >= 7.0) { 201 | [UIView animateWithDuration:0.4f delay:0.0f usingSpringWithDamping:1.0f initialSpringVelocity:0.0f options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 202 | this.cellContentView.frame = CGRectMake(0.0-self.rightMenus.count*CellMenuWidth, 0, ScreenWidth, this.cellHeight); 203 | } completion:^(BOOL finished) { 204 | self.isMoving = NO; 205 | this.cellStauts = MultiFunctionCellTypeForRightMenu; 206 | [self.cellActionDelegate tableMenuDidShowInCell:self]; 207 | }]; 208 | } else { 209 | [UIView animateWithDuration:0.2 animations:^{ 210 | this.cellContentView.frame = CGRectMake(0.0-self.rightMenus.count*CellMenuWidth, 0, ScreenWidth, this.cellHeight); 211 | } completion:^(BOOL finished) { 212 | self.isMoving = NO; 213 | this.cellStauts = MultiFunctionCellTypeForRightMenu; 214 | [self.cellActionDelegate tableMenuDidShowInCell:self]; 215 | }]; 216 | } 217 | } 218 | } 219 | 220 | - (void)setMenuHidden:(BOOL)hidden animated:(BOOL)animated completionHandler:(void (^)(void))completionHandler{ 221 | if (self.selected) { 222 | [self setSelected:NO animated:NO]; 223 | } 224 | if (hidden) { 225 | CGRect frame = self.cellContentView.frame; 226 | if (frame.origin.x != 0) { 227 | __block MultiFunctionCell *this = self; 228 | 229 | if (IsSystemVersionOverSeven) { 230 | [UIView animateWithDuration:0.4f delay:0.0f usingSpringWithDamping:1.0f initialSpringVelocity:0.0f options:UIViewAnimationOptionAllowAnimatedContent animations:^{ 231 | [this initCellFrame:0]; 232 | } completion:^(BOOL finished) { 233 | [this.cellActionDelegate tableMenuDidHideInCell:self]; 234 | if (completionHandler) { 235 | completionHandler(); 236 | } 237 | }]; 238 | } else { 239 | [UIView animateWithDuration:0.2 animations:^{ 240 | [self initCellFrame:0]; 241 | } completion:^(BOOL finished) { 242 | [self.cellActionDelegate tableMenuDidHideInCell:self]; 243 | if (completionHandler) { 244 | completionHandler(); 245 | } 246 | }]; 247 | } 248 | } 249 | } 250 | } 251 | 252 | - (void)initCellFrame:(float)x{ 253 | CGRect frame = self.cellContentView.frame; 254 | frame.origin.x = x; 255 | 256 | self.cellContentView.frame = frame; 257 | } 258 | 259 | 260 | - (UIButton *)createBtn:(CGRect)frame title:(NSString *)title titleColor:(UIColor *)titleColor bgcolor:(UIColor *)bgcolor menuTag:(NSInteger)menuTag{ 261 | UIButton *menuBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 262 | menuBtn.frame = frame; 263 | [menuBtn setBackgroundColor:bgcolor]; 264 | [menuBtn setTitle:title forState:UIControlStateNormal]; 265 | [menuBtn setTitleColor:titleColor forState:UIControlStateNormal]; 266 | menuBtn.tag = menuTag; 267 | [menuBtn addTarget:self action:@selector(menuClick:) forControlEvents:UIControlEventTouchUpInside]; 268 | 269 | return menuBtn; 270 | } 271 | 272 | - (void)menuClick:(id)sender{ 273 | UIButton *btn = (UIButton *)sender; 274 | if (self.cellActionDelegate && [self.cellActionDelegate respondsToSelector:@selector(cellMenuIndex:menuIndexNum:isLeftMenu:)]) { 275 | if (btn.tag >= 200) { 276 | [self.cellActionDelegate cellMenuIndex:[self.containTableView indexPathForCell:self] menuIndexNum:btn.tag-200 isLeftMenu:NO]; 277 | } else { 278 | [self.cellActionDelegate cellMenuIndex:[self.containTableView indexPathForCell:self] menuIndexNum:btn.tag-100 isLeftMenu:YES]; 279 | } 280 | } 281 | } 282 | 283 | - (void)awakeFromNib { 284 | // Initialization code 285 | } 286 | 287 | - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 288 | [super setSelected:selected animated:animated]; 289 | 290 | // Configure the view for the selected state 291 | } 292 | 293 | @end 294 | -------------------------------------------------------------------------------- /XZMultiFunctionCell.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | F8148CE51A5A6E61004809E2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148CE41A5A6E61004809E2 /* main.m */; }; 11 | F8148CE81A5A6E61004809E2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148CE71A5A6E61004809E2 /* AppDelegate.m */; }; 12 | F8148CEB1A5A6E61004809E2 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148CEA1A5A6E61004809E2 /* ViewController.m */; }; 13 | F8148CEE1A5A6E61004809E2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F8148CEC1A5A6E61004809E2 /* Main.storyboard */; }; 14 | F8148CF01A5A6E61004809E2 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F8148CEF1A5A6E61004809E2 /* Images.xcassets */; }; 15 | F8148CF31A5A6E61004809E2 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F8148CF11A5A6E61004809E2 /* LaunchScreen.xib */; }; 16 | F8148CFF1A5A6E61004809E2 /* XZMultiFunctionCellTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148CFE1A5A6E61004809E2 /* XZMultiFunctionCellTests.m */; }; 17 | F8148D0B1A5A6EB4004809E2 /* MultiFunctionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148D0A1A5A6EB4004809E2 /* MultiFunctionCell.m */; }; 18 | F8148D0E1A5A6ED0004809E2 /* OverLayView.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148D0D1A5A6ED0004809E2 /* OverLayView.m */; }; 19 | F8148D141A5A7E46004809E2 /* MultiFunctionTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148D131A5A7E46004809E2 /* MultiFunctionTableView.m */; }; 20 | F8148D171A5A7FA9004809E2 /* HomeViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F8148D161A5A7FA9004809E2 /* HomeViewCell.m */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | F8148CF91A5A6E61004809E2 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = F8148CD71A5A6E61004809E2 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = F8148CDE1A5A6E61004809E2; 29 | remoteInfo = XZMultiFunctionCell; 30 | }; 31 | /* End PBXContainerItemProxy section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | F8148CDF1A5A6E61004809E2 /* XZMultiFunctionCell.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XZMultiFunctionCell.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | F8148CE31A5A6E61004809E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | F8148CE41A5A6E61004809E2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 37 | F8148CE61A5A6E61004809E2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 38 | F8148CE71A5A6E61004809E2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 39 | F8148CE91A5A6E61004809E2 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | F8148CEA1A5A6E61004809E2 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | F8148CED1A5A6E61004809E2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | F8148CEF1A5A6E61004809E2 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 43 | F8148CF21A5A6E61004809E2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 44 | F8148CF81A5A6E61004809E2 /* XZMultiFunctionCellTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XZMultiFunctionCellTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | F8148CFD1A5A6E61004809E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | F8148CFE1A5A6E61004809E2 /* XZMultiFunctionCellTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XZMultiFunctionCellTests.m; sourceTree = ""; }; 47 | F8148D091A5A6EB4004809E2 /* MultiFunctionCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFunctionCell.h; sourceTree = ""; }; 48 | F8148D0A1A5A6EB4004809E2 /* MultiFunctionCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultiFunctionCell.m; sourceTree = ""; }; 49 | F8148D0C1A5A6ED0004809E2 /* OverLayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverLayView.h; sourceTree = ""; }; 50 | F8148D0D1A5A6ED0004809E2 /* OverLayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverLayView.m; sourceTree = ""; }; 51 | F8148D121A5A7E46004809E2 /* MultiFunctionTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiFunctionTableView.h; sourceTree = ""; }; 52 | F8148D131A5A7E46004809E2 /* MultiFunctionTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultiFunctionTableView.m; sourceTree = ""; }; 53 | F8148D151A5A7FA9004809E2 /* HomeViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeViewCell.h; sourceTree = ""; }; 54 | F8148D161A5A7FA9004809E2 /* HomeViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeViewCell.m; sourceTree = ""; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | F8148CDC1A5A6E61004809E2 /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | F8148CF51A5A6E61004809E2 /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | /* End PBXFrameworksBuildPhase section */ 73 | 74 | /* Begin PBXGroup section */ 75 | F8148CD61A5A6E61004809E2 = { 76 | isa = PBXGroup; 77 | children = ( 78 | F8148CE11A5A6E61004809E2 /* XZMultiFunctionCell */, 79 | F8148CFB1A5A6E61004809E2 /* XZMultiFunctionCellTests */, 80 | F8148CE01A5A6E61004809E2 /* Products */, 81 | ); 82 | sourceTree = ""; 83 | }; 84 | F8148CE01A5A6E61004809E2 /* Products */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | F8148CDF1A5A6E61004809E2 /* XZMultiFunctionCell.app */, 88 | F8148CF81A5A6E61004809E2 /* XZMultiFunctionCellTests.xctest */, 89 | ); 90 | name = Products; 91 | sourceTree = ""; 92 | }; 93 | F8148CE11A5A6E61004809E2 /* XZMultiFunctionCell */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | F8148D081A5A6E8D004809E2 /* MultiFunctionCell */, 97 | F8148CE61A5A6E61004809E2 /* AppDelegate.h */, 98 | F8148CE71A5A6E61004809E2 /* AppDelegate.m */, 99 | F8148CE91A5A6E61004809E2 /* ViewController.h */, 100 | F8148CEA1A5A6E61004809E2 /* ViewController.m */, 101 | F8148D151A5A7FA9004809E2 /* HomeViewCell.h */, 102 | F8148D161A5A7FA9004809E2 /* HomeViewCell.m */, 103 | F8148CEC1A5A6E61004809E2 /* Main.storyboard */, 104 | F8148CEF1A5A6E61004809E2 /* Images.xcassets */, 105 | F8148CF11A5A6E61004809E2 /* LaunchScreen.xib */, 106 | F8148CE21A5A6E61004809E2 /* Supporting Files */, 107 | ); 108 | path = XZMultiFunctionCell; 109 | sourceTree = ""; 110 | }; 111 | F8148CE21A5A6E61004809E2 /* Supporting Files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | F8148CE31A5A6E61004809E2 /* Info.plist */, 115 | F8148CE41A5A6E61004809E2 /* main.m */, 116 | ); 117 | name = "Supporting Files"; 118 | sourceTree = ""; 119 | }; 120 | F8148CFB1A5A6E61004809E2 /* XZMultiFunctionCellTests */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | F8148CFE1A5A6E61004809E2 /* XZMultiFunctionCellTests.m */, 124 | F8148CFC1A5A6E61004809E2 /* Supporting Files */, 125 | ); 126 | path = XZMultiFunctionCellTests; 127 | sourceTree = ""; 128 | }; 129 | F8148CFC1A5A6E61004809E2 /* Supporting Files */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | F8148CFD1A5A6E61004809E2 /* Info.plist */, 133 | ); 134 | name = "Supporting Files"; 135 | sourceTree = ""; 136 | }; 137 | F8148D081A5A6E8D004809E2 /* MultiFunctionCell */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | F8148D091A5A6EB4004809E2 /* MultiFunctionCell.h */, 141 | F8148D0A1A5A6EB4004809E2 /* MultiFunctionCell.m */, 142 | F8148D0C1A5A6ED0004809E2 /* OverLayView.h */, 143 | F8148D0D1A5A6ED0004809E2 /* OverLayView.m */, 144 | F8148D121A5A7E46004809E2 /* MultiFunctionTableView.h */, 145 | F8148D131A5A7E46004809E2 /* MultiFunctionTableView.m */, 146 | ); 147 | path = MultiFunctionCell; 148 | sourceTree = ""; 149 | }; 150 | /* End PBXGroup section */ 151 | 152 | /* Begin PBXNativeTarget section */ 153 | F8148CDE1A5A6E61004809E2 /* XZMultiFunctionCell */ = { 154 | isa = PBXNativeTarget; 155 | buildConfigurationList = F8148D021A5A6E61004809E2 /* Build configuration list for PBXNativeTarget "XZMultiFunctionCell" */; 156 | buildPhases = ( 157 | F8148CDB1A5A6E61004809E2 /* Sources */, 158 | F8148CDC1A5A6E61004809E2 /* Frameworks */, 159 | F8148CDD1A5A6E61004809E2 /* Resources */, 160 | ); 161 | buildRules = ( 162 | ); 163 | dependencies = ( 164 | ); 165 | name = XZMultiFunctionCell; 166 | productName = XZMultiFunctionCell; 167 | productReference = F8148CDF1A5A6E61004809E2 /* XZMultiFunctionCell.app */; 168 | productType = "com.apple.product-type.application"; 169 | }; 170 | F8148CF71A5A6E61004809E2 /* XZMultiFunctionCellTests */ = { 171 | isa = PBXNativeTarget; 172 | buildConfigurationList = F8148D051A5A6E61004809E2 /* Build configuration list for PBXNativeTarget "XZMultiFunctionCellTests" */; 173 | buildPhases = ( 174 | F8148CF41A5A6E61004809E2 /* Sources */, 175 | F8148CF51A5A6E61004809E2 /* Frameworks */, 176 | F8148CF61A5A6E61004809E2 /* Resources */, 177 | ); 178 | buildRules = ( 179 | ); 180 | dependencies = ( 181 | F8148CFA1A5A6E61004809E2 /* PBXTargetDependency */, 182 | ); 183 | name = XZMultiFunctionCellTests; 184 | productName = XZMultiFunctionCellTests; 185 | productReference = F8148CF81A5A6E61004809E2 /* XZMultiFunctionCellTests.xctest */; 186 | productType = "com.apple.product-type.bundle.unit-test"; 187 | }; 188 | /* End PBXNativeTarget section */ 189 | 190 | /* Begin PBXProject section */ 191 | F8148CD71A5A6E61004809E2 /* Project object */ = { 192 | isa = PBXProject; 193 | attributes = { 194 | LastUpgradeCheck = 0610; 195 | ORGANIZATIONNAME = xiazer; 196 | TargetAttributes = { 197 | F8148CDE1A5A6E61004809E2 = { 198 | CreatedOnToolsVersion = 6.1.1; 199 | }; 200 | F8148CF71A5A6E61004809E2 = { 201 | CreatedOnToolsVersion = 6.1.1; 202 | TestTargetID = F8148CDE1A5A6E61004809E2; 203 | }; 204 | }; 205 | }; 206 | buildConfigurationList = F8148CDA1A5A6E61004809E2 /* Build configuration list for PBXProject "XZMultiFunctionCell" */; 207 | compatibilityVersion = "Xcode 3.2"; 208 | developmentRegion = English; 209 | hasScannedForEncodings = 0; 210 | knownRegions = ( 211 | en, 212 | Base, 213 | ); 214 | mainGroup = F8148CD61A5A6E61004809E2; 215 | productRefGroup = F8148CE01A5A6E61004809E2 /* Products */; 216 | projectDirPath = ""; 217 | projectRoot = ""; 218 | targets = ( 219 | F8148CDE1A5A6E61004809E2 /* XZMultiFunctionCell */, 220 | F8148CF71A5A6E61004809E2 /* XZMultiFunctionCellTests */, 221 | ); 222 | }; 223 | /* End PBXProject section */ 224 | 225 | /* Begin PBXResourcesBuildPhase section */ 226 | F8148CDD1A5A6E61004809E2 /* Resources */ = { 227 | isa = PBXResourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | F8148CEE1A5A6E61004809E2 /* Main.storyboard in Resources */, 231 | F8148CF31A5A6E61004809E2 /* LaunchScreen.xib in Resources */, 232 | F8148CF01A5A6E61004809E2 /* Images.xcassets in Resources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | F8148CF61A5A6E61004809E2 /* Resources */ = { 237 | isa = PBXResourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | }; 243 | /* End PBXResourcesBuildPhase section */ 244 | 245 | /* Begin PBXSourcesBuildPhase section */ 246 | F8148CDB1A5A6E61004809E2 /* Sources */ = { 247 | isa = PBXSourcesBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | F8148CEB1A5A6E61004809E2 /* ViewController.m in Sources */, 251 | F8148D141A5A7E46004809E2 /* MultiFunctionTableView.m in Sources */, 252 | F8148D0E1A5A6ED0004809E2 /* OverLayView.m in Sources */, 253 | F8148CE81A5A6E61004809E2 /* AppDelegate.m in Sources */, 254 | F8148D171A5A7FA9004809E2 /* HomeViewCell.m in Sources */, 255 | F8148CE51A5A6E61004809E2 /* main.m in Sources */, 256 | F8148D0B1A5A6EB4004809E2 /* MultiFunctionCell.m in Sources */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | F8148CF41A5A6E61004809E2 /* Sources */ = { 261 | isa = PBXSourcesBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | F8148CFF1A5A6E61004809E2 /* XZMultiFunctionCellTests.m in Sources */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | /* End PBXSourcesBuildPhase section */ 269 | 270 | /* Begin PBXTargetDependency section */ 271 | F8148CFA1A5A6E61004809E2 /* PBXTargetDependency */ = { 272 | isa = PBXTargetDependency; 273 | target = F8148CDE1A5A6E61004809E2 /* XZMultiFunctionCell */; 274 | targetProxy = F8148CF91A5A6E61004809E2 /* PBXContainerItemProxy */; 275 | }; 276 | /* End PBXTargetDependency section */ 277 | 278 | /* Begin PBXVariantGroup section */ 279 | F8148CEC1A5A6E61004809E2 /* Main.storyboard */ = { 280 | isa = PBXVariantGroup; 281 | children = ( 282 | F8148CED1A5A6E61004809E2 /* Base */, 283 | ); 284 | name = Main.storyboard; 285 | sourceTree = ""; 286 | }; 287 | F8148CF11A5A6E61004809E2 /* LaunchScreen.xib */ = { 288 | isa = PBXVariantGroup; 289 | children = ( 290 | F8148CF21A5A6E61004809E2 /* Base */, 291 | ); 292 | name = LaunchScreen.xib; 293 | sourceTree = ""; 294 | }; 295 | /* End PBXVariantGroup section */ 296 | 297 | /* Begin XCBuildConfiguration section */ 298 | F8148D001A5A6E61004809E2 /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | ALWAYS_SEARCH_USER_PATHS = NO; 302 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 303 | CLANG_CXX_LIBRARY = "libc++"; 304 | CLANG_ENABLE_MODULES = YES; 305 | CLANG_ENABLE_OBJC_ARC = YES; 306 | CLANG_WARN_BOOL_CONVERSION = YES; 307 | CLANG_WARN_CONSTANT_CONVERSION = YES; 308 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 309 | CLANG_WARN_EMPTY_BODY = YES; 310 | CLANG_WARN_ENUM_CONVERSION = YES; 311 | CLANG_WARN_INT_CONVERSION = YES; 312 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 313 | CLANG_WARN_UNREACHABLE_CODE = YES; 314 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 315 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 316 | COPY_PHASE_STRIP = NO; 317 | ENABLE_STRICT_OBJC_MSGSEND = YES; 318 | GCC_C_LANGUAGE_STANDARD = gnu99; 319 | GCC_DYNAMIC_NO_PIC = NO; 320 | GCC_OPTIMIZATION_LEVEL = 0; 321 | GCC_PREPROCESSOR_DEFINITIONS = ( 322 | "DEBUG=1", 323 | "$(inherited)", 324 | ); 325 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 326 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 327 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 328 | GCC_WARN_UNDECLARED_SELECTOR = YES; 329 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 330 | GCC_WARN_UNUSED_FUNCTION = YES; 331 | GCC_WARN_UNUSED_VARIABLE = YES; 332 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 333 | MTL_ENABLE_DEBUG_INFO = YES; 334 | ONLY_ACTIVE_ARCH = YES; 335 | SDKROOT = iphoneos; 336 | }; 337 | name = Debug; 338 | }; 339 | F8148D011A5A6E61004809E2 /* Release */ = { 340 | isa = XCBuildConfiguration; 341 | buildSettings = { 342 | ALWAYS_SEARCH_USER_PATHS = NO; 343 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 344 | CLANG_CXX_LIBRARY = "libc++"; 345 | CLANG_ENABLE_MODULES = YES; 346 | CLANG_ENABLE_OBJC_ARC = YES; 347 | CLANG_WARN_BOOL_CONVERSION = YES; 348 | CLANG_WARN_CONSTANT_CONVERSION = YES; 349 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 350 | CLANG_WARN_EMPTY_BODY = YES; 351 | CLANG_WARN_ENUM_CONVERSION = YES; 352 | CLANG_WARN_INT_CONVERSION = YES; 353 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 354 | CLANG_WARN_UNREACHABLE_CODE = YES; 355 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 356 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 357 | COPY_PHASE_STRIP = YES; 358 | ENABLE_NS_ASSERTIONS = NO; 359 | ENABLE_STRICT_OBJC_MSGSEND = YES; 360 | GCC_C_LANGUAGE_STANDARD = gnu99; 361 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 362 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 363 | GCC_WARN_UNDECLARED_SELECTOR = YES; 364 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 365 | GCC_WARN_UNUSED_FUNCTION = YES; 366 | GCC_WARN_UNUSED_VARIABLE = YES; 367 | IPHONEOS_DEPLOYMENT_TARGET = 8.1; 368 | MTL_ENABLE_DEBUG_INFO = NO; 369 | SDKROOT = iphoneos; 370 | VALIDATE_PRODUCT = YES; 371 | }; 372 | name = Release; 373 | }; 374 | F8148D031A5A6E61004809E2 /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | buildSettings = { 377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 378 | INFOPLIST_FILE = XZMultiFunctionCell/Info.plist; 379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 380 | PRODUCT_NAME = "$(TARGET_NAME)"; 381 | }; 382 | name = Debug; 383 | }; 384 | F8148D041A5A6E61004809E2 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 388 | INFOPLIST_FILE = XZMultiFunctionCell/Info.plist; 389 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 390 | PRODUCT_NAME = "$(TARGET_NAME)"; 391 | }; 392 | name = Release; 393 | }; 394 | F8148D061A5A6E61004809E2 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | BUNDLE_LOADER = "$(TEST_HOST)"; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(SDKROOT)/Developer/Library/Frameworks", 400 | "$(inherited)", 401 | ); 402 | GCC_PREPROCESSOR_DEFINITIONS = ( 403 | "DEBUG=1", 404 | "$(inherited)", 405 | ); 406 | INFOPLIST_FILE = XZMultiFunctionCellTests/Info.plist; 407 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 408 | PRODUCT_NAME = "$(TARGET_NAME)"; 409 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XZMultiFunctionCell.app/XZMultiFunctionCell"; 410 | }; 411 | name = Debug; 412 | }; 413 | F8148D071A5A6E61004809E2 /* Release */ = { 414 | isa = XCBuildConfiguration; 415 | buildSettings = { 416 | BUNDLE_LOADER = "$(TEST_HOST)"; 417 | FRAMEWORK_SEARCH_PATHS = ( 418 | "$(SDKROOT)/Developer/Library/Frameworks", 419 | "$(inherited)", 420 | ); 421 | INFOPLIST_FILE = XZMultiFunctionCellTests/Info.plist; 422 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 423 | PRODUCT_NAME = "$(TARGET_NAME)"; 424 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/XZMultiFunctionCell.app/XZMultiFunctionCell"; 425 | }; 426 | name = Release; 427 | }; 428 | /* End XCBuildConfiguration section */ 429 | 430 | /* Begin XCConfigurationList section */ 431 | F8148CDA1A5A6E61004809E2 /* Build configuration list for PBXProject "XZMultiFunctionCell" */ = { 432 | isa = XCConfigurationList; 433 | buildConfigurations = ( 434 | F8148D001A5A6E61004809E2 /* Debug */, 435 | F8148D011A5A6E61004809E2 /* Release */, 436 | ); 437 | defaultConfigurationIsVisible = 0; 438 | defaultConfigurationName = Release; 439 | }; 440 | F8148D021A5A6E61004809E2 /* Build configuration list for PBXNativeTarget "XZMultiFunctionCell" */ = { 441 | isa = XCConfigurationList; 442 | buildConfigurations = ( 443 | F8148D031A5A6E61004809E2 /* Debug */, 444 | F8148D041A5A6E61004809E2 /* Release */, 445 | ); 446 | defaultConfigurationIsVisible = 0; 447 | }; 448 | F8148D051A5A6E61004809E2 /* Build configuration list for PBXNativeTarget "XZMultiFunctionCellTests" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | F8148D061A5A6E61004809E2 /* Debug */, 452 | F8148D071A5A6E61004809E2 /* Release */, 453 | ); 454 | defaultConfigurationIsVisible = 0; 455 | }; 456 | /* End XCConfigurationList section */ 457 | }; 458 | rootObject = F8148CD71A5A6E61004809E2 /* Project object */; 459 | } 460 | --------------------------------------------------------------------------------