├── README.md ├── TableViewHeaderStretching.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── wangchangfei.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── wangchangfei.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── TableViewHeaderStretching.xcscheme │ └── xcschememanagement.plist └── TableViewHeaderStretching ├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets ├── AppIcon.appiconset │ └── Contents.json ├── Contents.json ├── bg.imageset │ ├── Contents.json │ └── bg.png └── navigation_background.imageset │ ├── Contents.json │ └── navigation_background@2x.png ├── HeaderStretchingTableViewController ├── HeaderStretchingTableViewController.h ├── HeaderStretchingTableViewController.m └── HeaderStretchingTableViewControllerDemo │ ├── StrechDemoViewController.h │ └── StrechDemoViewController.m ├── HeaderStretchingTableViewControllerDemo ├── StrechDemoViewController.h └── StrechDemoViewController.m ├── Info.plist └── main.m /README.md: -------------------------------------------------------------------------------- 1 | # TableViewHeaderStretching 2 | 3 | ### 快速集成可拉伸头部图片的UITableView 4 | 5 | ### 测试环境:Xcode 7.0,iOS 7.0 以上 6 | 7 | ![image](http://cdn.cocimg.com/bbs/attachment/Fid_19/19_332211_32a461d161ff5de.gif) 8 | 9 | ### 集成步骤: 10 | 11 | ##### 0、将HeaderStretchingTableViewController文件夹拽入自己的项目中 12 | 13 | ##### 1、新建一个UITableViewController继承自HeaderStretchingTableViewController 14 | 15 | ##### 2、设置导航栏的背景图片 16 | ```swift 17 | self.navigation_backgroundImageName = @"navigation_background" 18 | ``` 19 | ##### 3、设置被拉伸图片view的高度 20 | ```swift 21 | self.stretchingImageHeight = 200 22 | ``` 23 | 24 | ##### 4、设置头部拉伸图片的名称 25 | ```swift 26 | self.stretchingImageName = @"image_bg" 27 | ``` 28 | -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D50F8AC91BB27C69007402DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D50F8AC81BB27C69007402DD /* main.m */; }; 11 | D50F8ACC1BB27C69007402DD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D50F8ACB1BB27C69007402DD /* AppDelegate.m */; }; 12 | D50F8AD41BB27C69007402DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D50F8AD31BB27C69007402DD /* Assets.xcassets */; }; 13 | D55693991BB2A79F00F1D354 /* HeaderStretchingTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D55693981BB2A79F00F1D354 /* HeaderStretchingTableViewController.m */; settings = {ASSET_TAGS = (); }; }; 14 | D58CA5981BB94BBA009F983C /* StrechDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D58CA5971BB94BBA009F983C /* StrechDemoViewController.m */; settings = {ASSET_TAGS = (); }; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXFileReference section */ 18 | D50F8AC41BB27C69007402DD /* TableViewHeaderStretching.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TableViewHeaderStretching.app; sourceTree = BUILT_PRODUCTS_DIR; }; 19 | D50F8AC81BB27C69007402DD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 20 | D50F8ACA1BB27C69007402DD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 21 | D50F8ACB1BB27C69007402DD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 22 | D50F8AD31BB27C69007402DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 23 | D50F8AD81BB27C69007402DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 24 | D55693971BB2A79F00F1D354 /* HeaderStretchingTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeaderStretchingTableViewController.h; sourceTree = ""; }; 25 | D55693981BB2A79F00F1D354 /* HeaderStretchingTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HeaderStretchingTableViewController.m; sourceTree = ""; }; 26 | D58CA5961BB94BBA009F983C /* StrechDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StrechDemoViewController.h; sourceTree = ""; }; 27 | D58CA5971BB94BBA009F983C /* StrechDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StrechDemoViewController.m; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | D50F8AC11BB27C69007402DD /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | D50F8ABB1BB27C69007402DD = { 42 | isa = PBXGroup; 43 | children = ( 44 | D50F8AC61BB27C69007402DD /* TableViewHeaderStretching */, 45 | D50F8AC51BB27C69007402DD /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | D50F8AC51BB27C69007402DD /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | D50F8AC41BB27C69007402DD /* TableViewHeaderStretching.app */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | D50F8AC61BB27C69007402DD /* TableViewHeaderStretching */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | D55693961BB2A79F00F1D354 /* HeaderStretchingTableViewController */, 61 | D58CA5951BB94BBA009F983C /* HeaderStretchingTableViewControllerDemo */, 62 | D50F8AD31BB27C69007402DD /* Assets.xcassets */, 63 | D50F8AC71BB27C69007402DD /* Supporting Files */, 64 | ); 65 | path = TableViewHeaderStretching; 66 | sourceTree = ""; 67 | }; 68 | D50F8AC71BB27C69007402DD /* Supporting Files */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | D50F8AD81BB27C69007402DD /* Info.plist */, 72 | D50F8ACA1BB27C69007402DD /* AppDelegate.h */, 73 | D50F8ACB1BB27C69007402DD /* AppDelegate.m */, 74 | D50F8AC81BB27C69007402DD /* main.m */, 75 | ); 76 | name = "Supporting Files"; 77 | sourceTree = ""; 78 | }; 79 | D55693961BB2A79F00F1D354 /* HeaderStretchingTableViewController */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | D55693971BB2A79F00F1D354 /* HeaderStretchingTableViewController.h */, 83 | D55693981BB2A79F00F1D354 /* HeaderStretchingTableViewController.m */, 84 | ); 85 | path = HeaderStretchingTableViewController; 86 | sourceTree = ""; 87 | }; 88 | D58CA5951BB94BBA009F983C /* HeaderStretchingTableViewControllerDemo */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | D58CA5961BB94BBA009F983C /* StrechDemoViewController.h */, 92 | D58CA5971BB94BBA009F983C /* StrechDemoViewController.m */, 93 | ); 94 | name = HeaderStretchingTableViewControllerDemo; 95 | path = HeaderStretchingTableViewController/HeaderStretchingTableViewControllerDemo; 96 | sourceTree = ""; 97 | }; 98 | /* End PBXGroup section */ 99 | 100 | /* Begin PBXNativeTarget section */ 101 | D50F8AC31BB27C69007402DD /* TableViewHeaderStretching */ = { 102 | isa = PBXNativeTarget; 103 | buildConfigurationList = D50F8AF11BB27C69007402DD /* Build configuration list for PBXNativeTarget "TableViewHeaderStretching" */; 104 | buildPhases = ( 105 | D50F8AC01BB27C69007402DD /* Sources */, 106 | D50F8AC11BB27C69007402DD /* Frameworks */, 107 | D50F8AC21BB27C69007402DD /* Resources */, 108 | ); 109 | buildRules = ( 110 | ); 111 | dependencies = ( 112 | ); 113 | name = TableViewHeaderStretching; 114 | productName = TableViewHeaderStretching; 115 | productReference = D50F8AC41BB27C69007402DD /* TableViewHeaderStretching.app */; 116 | productType = "com.apple.product-type.application"; 117 | }; 118 | /* End PBXNativeTarget section */ 119 | 120 | /* Begin PBXProject section */ 121 | D50F8ABC1BB27C69007402DD /* Project object */ = { 122 | isa = PBXProject; 123 | attributes = { 124 | LastUpgradeCheck = 0700; 125 | ORGANIZATIONNAME = wangchangfei; 126 | TargetAttributes = { 127 | D50F8AC31BB27C69007402DD = { 128 | CreatedOnToolsVersion = 7.0; 129 | }; 130 | }; 131 | }; 132 | buildConfigurationList = D50F8ABF1BB27C69007402DD /* Build configuration list for PBXProject "TableViewHeaderStretching" */; 133 | compatibilityVersion = "Xcode 3.2"; 134 | developmentRegion = English; 135 | hasScannedForEncodings = 0; 136 | knownRegions = ( 137 | en, 138 | Base, 139 | ); 140 | mainGroup = D50F8ABB1BB27C69007402DD; 141 | productRefGroup = D50F8AC51BB27C69007402DD /* Products */; 142 | projectDirPath = ""; 143 | projectRoot = ""; 144 | targets = ( 145 | D50F8AC31BB27C69007402DD /* TableViewHeaderStretching */, 146 | ); 147 | }; 148 | /* End PBXProject section */ 149 | 150 | /* Begin PBXResourcesBuildPhase section */ 151 | D50F8AC21BB27C69007402DD /* Resources */ = { 152 | isa = PBXResourcesBuildPhase; 153 | buildActionMask = 2147483647; 154 | files = ( 155 | D50F8AD41BB27C69007402DD /* Assets.xcassets in Resources */, 156 | ); 157 | runOnlyForDeploymentPostprocessing = 0; 158 | }; 159 | /* End PBXResourcesBuildPhase section */ 160 | 161 | /* Begin PBXSourcesBuildPhase section */ 162 | D50F8AC01BB27C69007402DD /* Sources */ = { 163 | isa = PBXSourcesBuildPhase; 164 | buildActionMask = 2147483647; 165 | files = ( 166 | D58CA5981BB94BBA009F983C /* StrechDemoViewController.m in Sources */, 167 | D50F8ACC1BB27C69007402DD /* AppDelegate.m in Sources */, 168 | D50F8AC91BB27C69007402DD /* main.m in Sources */, 169 | D55693991BB2A79F00F1D354 /* HeaderStretchingTableViewController.m in Sources */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | /* End PBXSourcesBuildPhase section */ 174 | 175 | /* Begin XCBuildConfiguration section */ 176 | D50F8AEF1BB27C69007402DD /* Debug */ = { 177 | isa = XCBuildConfiguration; 178 | buildSettings = { 179 | ALWAYS_SEARCH_USER_PATHS = NO; 180 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 181 | CLANG_CXX_LIBRARY = "libc++"; 182 | CLANG_ENABLE_MODULES = YES; 183 | CLANG_ENABLE_OBJC_ARC = YES; 184 | CLANG_WARN_BOOL_CONVERSION = YES; 185 | CLANG_WARN_CONSTANT_CONVERSION = YES; 186 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 187 | CLANG_WARN_EMPTY_BODY = YES; 188 | CLANG_WARN_ENUM_CONVERSION = YES; 189 | CLANG_WARN_INT_CONVERSION = YES; 190 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 191 | CLANG_WARN_UNREACHABLE_CODE = YES; 192 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 193 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 194 | COPY_PHASE_STRIP = NO; 195 | DEBUG_INFORMATION_FORMAT = dwarf; 196 | ENABLE_STRICT_OBJC_MSGSEND = YES; 197 | ENABLE_TESTABILITY = YES; 198 | GCC_C_LANGUAGE_STANDARD = gnu99; 199 | GCC_DYNAMIC_NO_PIC = NO; 200 | GCC_NO_COMMON_BLOCKS = YES; 201 | GCC_OPTIMIZATION_LEVEL = 0; 202 | GCC_PREPROCESSOR_DEFINITIONS = ( 203 | "DEBUG=1", 204 | "$(inherited)", 205 | ); 206 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 207 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 208 | GCC_WARN_UNDECLARED_SELECTOR = YES; 209 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 210 | GCC_WARN_UNUSED_FUNCTION = YES; 211 | GCC_WARN_UNUSED_VARIABLE = YES; 212 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 213 | MTL_ENABLE_DEBUG_INFO = YES; 214 | ONLY_ACTIVE_ARCH = YES; 215 | SDKROOT = iphoneos; 216 | }; 217 | name = Debug; 218 | }; 219 | D50F8AF01BB27C69007402DD /* Release */ = { 220 | isa = XCBuildConfiguration; 221 | buildSettings = { 222 | ALWAYS_SEARCH_USER_PATHS = NO; 223 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 224 | CLANG_CXX_LIBRARY = "libc++"; 225 | CLANG_ENABLE_MODULES = YES; 226 | CLANG_ENABLE_OBJC_ARC = YES; 227 | CLANG_WARN_BOOL_CONVERSION = YES; 228 | CLANG_WARN_CONSTANT_CONVERSION = YES; 229 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 230 | CLANG_WARN_EMPTY_BODY = YES; 231 | CLANG_WARN_ENUM_CONVERSION = YES; 232 | CLANG_WARN_INT_CONVERSION = YES; 233 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 234 | CLANG_WARN_UNREACHABLE_CODE = YES; 235 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 236 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 237 | COPY_PHASE_STRIP = NO; 238 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 239 | ENABLE_NS_ASSERTIONS = NO; 240 | ENABLE_STRICT_OBJC_MSGSEND = YES; 241 | GCC_C_LANGUAGE_STANDARD = gnu99; 242 | GCC_NO_COMMON_BLOCKS = YES; 243 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 244 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 245 | GCC_WARN_UNDECLARED_SELECTOR = YES; 246 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 247 | GCC_WARN_UNUSED_FUNCTION = YES; 248 | GCC_WARN_UNUSED_VARIABLE = YES; 249 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 250 | MTL_ENABLE_DEBUG_INFO = NO; 251 | SDKROOT = iphoneos; 252 | VALIDATE_PRODUCT = YES; 253 | }; 254 | name = Release; 255 | }; 256 | D50F8AF21BB27C69007402DD /* Debug */ = { 257 | isa = XCBuildConfiguration; 258 | buildSettings = { 259 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 260 | INFOPLIST_FILE = TableViewHeaderStretching/Info.plist; 261 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 262 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 263 | PRODUCT_BUNDLE_IDENTIFIER = com.cf.TableViewHeaderStretching; 264 | PRODUCT_NAME = "$(TARGET_NAME)"; 265 | }; 266 | name = Debug; 267 | }; 268 | D50F8AF31BB27C69007402DD /* Release */ = { 269 | isa = XCBuildConfiguration; 270 | buildSettings = { 271 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 272 | INFOPLIST_FILE = TableViewHeaderStretching/Info.plist; 273 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 274 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 275 | PRODUCT_BUNDLE_IDENTIFIER = com.cf.TableViewHeaderStretching; 276 | PRODUCT_NAME = "$(TARGET_NAME)"; 277 | }; 278 | name = Release; 279 | }; 280 | /* End XCBuildConfiguration section */ 281 | 282 | /* Begin XCConfigurationList section */ 283 | D50F8ABF1BB27C69007402DD /* Build configuration list for PBXProject "TableViewHeaderStretching" */ = { 284 | isa = XCConfigurationList; 285 | buildConfigurations = ( 286 | D50F8AEF1BB27C69007402DD /* Debug */, 287 | D50F8AF01BB27C69007402DD /* Release */, 288 | ); 289 | defaultConfigurationIsVisible = 0; 290 | defaultConfigurationName = Release; 291 | }; 292 | D50F8AF11BB27C69007402DD /* Build configuration list for PBXNativeTarget "TableViewHeaderStretching" */ = { 293 | isa = XCConfigurationList; 294 | buildConfigurations = ( 295 | D50F8AF21BB27C69007402DD /* Debug */, 296 | D50F8AF31BB27C69007402DD /* Release */, 297 | ); 298 | defaultConfigurationIsVisible = 0; 299 | defaultConfigurationName = Release; 300 | }; 301 | /* End XCConfigurationList section */ 302 | }; 303 | rootObject = D50F8ABC1BB27C69007402DD /* Project object */; 304 | } 305 | -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/project.xcworkspace/xcuserdata/wangchangfei.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangchangfei/TableViewHeaderStretching/dfe4f0b4aca9b84cbe994f129faef96c1fdaa15e/TableViewHeaderStretching.xcodeproj/project.xcworkspace/xcuserdata/wangchangfei.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/xcuserdata/wangchangfei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/xcuserdata/wangchangfei.xcuserdatad/xcschemes/TableViewHeaderStretching.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /TableViewHeaderStretching.xcodeproj/xcuserdata/wangchangfei.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | TableViewHeaderStretching.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D50F8AC31BB27C69007402DD 16 | 17 | primary 18 | 19 | 20 | D50F8ADC1BB27C69007402DD 21 | 22 | primary 23 | 24 | 25 | D50F8AE71BB27C69007402DD 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. 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 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #import "StrechDemoViewController.h" 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | 20 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 21 | 22 | // 创建窗口 23 | self.window = [[UIWindow alloc] init]; 24 | self.window.frame = [UIScreen mainScreen].bounds; 25 | 26 | // 设置根控制器 27 | StrechDemoViewController *vc = [[StrechDemoViewController alloc]init]; 28 | UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc]; 29 | 30 | self.window.rootViewController = nav; 31 | 32 | // 显示窗口 33 | [self.window makeKeyAndVisible]; 34 | 35 | 36 | return YES; 37 | } 38 | 39 | - (void)applicationWillResignActive:(UIApplication *)application { 40 | // 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. 41 | // 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. 42 | } 43 | 44 | - (void)applicationDidEnterBackground:(UIApplication *)application { 45 | // 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. 46 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 47 | } 48 | 49 | - (void)applicationWillEnterForeground:(UIApplication *)application { 50 | // 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. 51 | } 52 | 53 | - (void)applicationDidBecomeActive:(UIApplication *)application { 54 | // 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. 55 | } 56 | 57 | - (void)applicationWillTerminate:(UIApplication *)application { 58 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 59 | } 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/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 | } -------------------------------------------------------------------------------- /TableViewHeaderStretching/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /TableViewHeaderStretching/Assets.xcassets/bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "bg.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /TableViewHeaderStretching/Assets.xcassets/bg.imageset/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangchangfei/TableViewHeaderStretching/dfe4f0b4aca9b84cbe994f129faef96c1fdaa15e/TableViewHeaderStretching/Assets.xcassets/bg.imageset/bg.png -------------------------------------------------------------------------------- /TableViewHeaderStretching/Assets.xcassets/navigation_background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "navigation_background@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /TableViewHeaderStretching/Assets.xcassets/navigation_background.imageset/navigation_background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangchangfei/TableViewHeaderStretching/dfe4f0b4aca9b84cbe994f129faef96c1fdaa15e/TableViewHeaderStretching/Assets.xcassets/navigation_background.imageset/navigation_background@2x.png -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewController/HeaderStretchingTableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // HeaderStretchingTableViewController.h 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface HeaderStretchingTableViewController : UITableViewController 12 | /** 13 | * 导航栏背景图片名称 14 | */ 15 | @property(nonatomic,copy)NSString* navigation_backgroundImageName; 16 | 17 | /** 18 | * 头部被拉伸图片控件的高度 19 | */ 20 | @property (nonatomic, assign) CGFloat stretchingImageHeight; 21 | 22 | /** 23 | * 头部被拉伸图片名称 24 | */ 25 | @property (nonatomic, copy) NSString *stretchingImageName; 26 | @end 27 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewController/HeaderStretchingTableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // HeaderStretchingTableViewController.m 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import "HeaderStretchingTableViewController.h" 10 | 11 | 12 | //头部被拉伸图片控件的默认高度 13 | CGFloat CFTopViewH = 200; 14 | 15 | @interface HeaderStretchingTableViewController () 16 | 17 | /** 顶部拉伸的图片 */ 18 | @property (nonatomic, weak) UIImageView *topView; 19 | 20 | /** 导航栏背景图片 */ 21 | @property (nonatomic, strong) UIImage *navigation_background_image; 22 | 23 | 24 | @end 25 | 26 | @implementation HeaderStretchingTableViewController 27 | 28 | -(UIImage *)navigation_background_image{ 29 | if(!_navigation_background_image){ 30 | if(self.navigation_backgroundImageName){ 31 | _navigation_background_image = [UIImage imageNamed:self.navigation_backgroundImageName]; 32 | } 33 | } 34 | return _navigation_background_image; 35 | } 36 | 37 | -(void)setStretchingImageHeight:(CGFloat)stretchingImageHeight{ 38 | _stretchingImageHeight = stretchingImageHeight; 39 | CFTopViewH = stretchingImageHeight; 40 | self.tableView.contentInset = UIEdgeInsetsMake(stretchingImageHeight , 0, 0, 0); 41 | self.topView.frame = CGRectMake(0, -CFTopViewH, self.tableView.frame.size.width, CFTopViewH); 42 | } 43 | 44 | - (void)setStretchingImageName:(NSString *)stretchingImageName{ 45 | _stretchingImageName = stretchingImageName; 46 | self.topView.image = [UIImage imageNamed:stretchingImageName]; 47 | } 48 | 49 | - (void)viewDidLoad { 50 | [super viewDidLoad]; 51 | 52 | // 设置内边距(让cell往下移动一段距离) 53 | self.tableView.contentInset = UIEdgeInsetsMake(CFTopViewH , 0, 0, 0); 54 | self.automaticallyAdjustsScrollViewInsets=NO; 55 | [self.navigationController.navigationBar setShadowImage:[[UIImage alloc] init]]; 56 | 57 | UIImageView *topView = [[UIImageView alloc] init]; 58 | topView.frame = CGRectMake(0, -CFTopViewH, self.tableView.frame.size.width, CFTopViewH); 59 | [self.tableView addSubview:topView]; 60 | self.topView = topView; 61 | } 62 | 63 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 64 | CGFloat yOffset = scrollView.contentOffset.y; 65 | CGFloat xOffset = (yOffset + CFTopViewH) / 2; 66 | 67 | if (yOffset < -CFTopViewH) { 68 | CGRect rect = self.topView.frame; 69 | rect.origin.y = yOffset; 70 | rect.size.height = -yOffset ; 71 | rect.origin.x = xOffset; 72 | rect.size.width = scrollView.frame.size.width + fabs(xOffset) * 2; 73 | 74 | self.topView.frame = rect; 75 | } 76 | 77 | CGFloat alpha = (yOffset + CFTopViewH) / CFTopViewH; 78 | if(self.edgesForExtendedLayout == UIRectEdgeTop || self.edgesForExtendedLayout == UIRectEdgeAll){ 79 | [self.navigationController.navigationBar setBackgroundImage:[self imageByApplyingAlpha:alpha image:self.navigation_background_image == nil?[self imageWithColor:[UIColor orangeColor]]:self.navigation_background_image] forBarMetrics:UIBarMetricsDefault]; 80 | } 81 | } 82 | 83 | //设置图片透明度 84 | - (UIImage *)imageByApplyingAlpha:(CGFloat)alpha image:(UIImage*)image { 85 | UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f); 86 | 87 | CGContextRef ctx = UIGraphicsGetCurrentContext(); 88 | CGRect area = CGRectMake(0, 0, image.size.width, image.size.height); 89 | 90 | CGContextScaleCTM(ctx, 1, -1); 91 | CGContextTranslateCTM(ctx, 0, -area.size.height); 92 | 93 | CGContextSetBlendMode(ctx, kCGBlendModeMultiply); 94 | 95 | CGContextSetAlpha(ctx, alpha); 96 | 97 | CGContextDrawImage(ctx, area, image.CGImage); 98 | 99 | UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 100 | 101 | UIGraphicsEndImageContext(); 102 | 103 | return newImage; 104 | } 105 | 106 | - (UIImage *)imageWithColor:(UIColor *)color { 107 | // 描述矩形 108 | CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 109 | 110 | // 开启位图上下文 111 | UIGraphicsBeginImageContext(rect.size); 112 | // 获取位图上下文 113 | CGContextRef context = UIGraphicsGetCurrentContext(); 114 | // 使用color演示填充上下文 115 | CGContextSetFillColorWithColor(context, [color CGColor]); 116 | // 渲染上下文 117 | CGContextFillRect(context, rect); 118 | // 从上下文中获取图片 119 | UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext(); 120 | // 结束上下文 121 | UIGraphicsEndImageContext(); 122 | 123 | return theImage; 124 | } 125 | @end 126 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewController/HeaderStretchingTableViewControllerDemo/StrechDemoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // StrechDemoViewController.h 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "HeaderStretchingTableViewController.h" 11 | 12 | @interface StrechDemoViewController : HeaderStretchingTableViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewController/HeaderStretchingTableViewControllerDemo/StrechDemoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // StrechDemoViewController.m 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import "StrechDemoViewController.h" 10 | 11 | @interface StrechDemoViewController () 12 | { 13 | UIButton *leftBtn; 14 | UIButton *rightBtn; 15 | } 16 | @end 17 | 18 | @implementation StrechDemoViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | 23 | // 1、 设置导航栏的背景图片 24 | self.navigation_backgroundImageName = @"navigation_background"; 25 | 26 | // 2、设置被拉伸图片view的高度 27 | self.stretchingImageHeight = 200; 28 | 29 | // 3、设置头部拉伸图片的名称 30 | self.stretchingImageName = @"bg"; 31 | 32 | 33 | 34 | 35 | leftBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 30)]; 36 | [leftBtn setTitle:@"left" forState:UIControlStateNormal]; 37 | [leftBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 38 | [leftBtn addTarget:self action:@selector(leftBtnClick) forControlEvents:UIControlEventTouchUpInside]; 39 | 40 | UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithCustomView:leftBtn]; 41 | self.navigationItem.leftBarButtonItem = leftItem; 42 | 43 | rightBtn=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 30)]; 44 | [rightBtn setTitle:@"right" forState:UIControlStateNormal]; 45 | [rightBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 46 | [rightBtn addTarget:self action:@selector(rightBtnClick) forControlEvents:UIControlEventTouchUpInside]; 47 | 48 | 49 | UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithCustomView:rightBtn]; 50 | self.navigationItem.rightBarButtonItem = rightItem; 51 | } 52 | 53 | -(void)leftBtnClick { 54 | NSLog(@"leftClick"); 55 | } 56 | 57 | 58 | -(void)rightBtnClick { 59 | NSLog(@"rightClick"); 60 | } 61 | 62 | 63 | 64 | #pragma mark - 数据源方法 65 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 66 | return 30; 67 | } 68 | 69 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 70 | static NSString *ID = @"cell"; 71 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 72 | if (!cell) { 73 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; 74 | } 75 | 76 | cell.textLabel.text = [NSString stringWithFormat:@"测试数据---%ld", (long)indexPath.row]; 77 | 78 | return cell; 79 | } 80 | 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewControllerDemo/StrechDemoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // StrechDemoViewController.h 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "HeaderStretchingTableViewController.h" 11 | 12 | @interface StrechDemoViewController : HeaderStretchingTableViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/HeaderStretchingTableViewControllerDemo/StrechDemoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // StrechDemoViewController.m 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. All rights reserved. 7 | // 8 | 9 | #import "StrechDemoViewController.h" 10 | 11 | @interface StrechDemoViewController () 12 | { 13 | UIButton *leftBtn; 14 | UIButton *rightBtn; 15 | } 16 | @end 17 | 18 | @implementation StrechDemoViewController 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | 23 | // 1、 设置导航栏的背景图片 24 | self.navigation_backgroundImageName = @"navigation_background"; 25 | 26 | // 2、设置被拉伸图片view的高度 27 | self.stretchingImageHeight = 200; 28 | 29 | // 3、设置头部拉伸图片的名称 30 | self.stretchingImageName = @"bg"; 31 | 32 | 33 | 34 | 35 | leftBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 30)]; 36 | [leftBtn setTitle:@"left" forState:UIControlStateNormal]; 37 | [leftBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 38 | [leftBtn addTarget:self action:@selector(leftBtnClick) forControlEvents:UIControlEventTouchUpInside]; 39 | 40 | UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithCustomView:leftBtn]; 41 | self.navigationItem.leftBarButtonItem = leftItem; 42 | 43 | rightBtn=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 30)]; 44 | [rightBtn setTitle:@"right" forState:UIControlStateNormal]; 45 | [rightBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 46 | [rightBtn addTarget:self action:@selector(rightBtnClick) forControlEvents:UIControlEventTouchUpInside]; 47 | 48 | 49 | UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithCustomView:rightBtn]; 50 | self.navigationItem.rightBarButtonItem = rightItem; 51 | } 52 | 53 | -(void)leftBtnClick { 54 | NSLog(@"leftClick"); 55 | } 56 | 57 | 58 | -(void)rightBtnClick { 59 | NSLog(@"rightClick"); 60 | } 61 | 62 | 63 | 64 | #pragma mark - 数据源方法 65 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 66 | return 30; 67 | } 68 | 69 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 70 | static NSString *ID = @"cell"; 71 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 72 | if (!cell) { 73 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; 74 | } 75 | 76 | cell.textLabel.text = [NSString stringWithFormat:@"测试数据---%ld", (long)indexPath.row]; 77 | 78 | return cell; 79 | } 80 | 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0.0 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /TableViewHeaderStretching/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TableViewHeaderStretching 4 | // 5 | // Created by wangchangfei on 15/9/23. 6 | // Copyright © 2015年 wangchangfei. 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 | --------------------------------------------------------------------------------