Static footer in iOS

footer, ios, uitableview

Solution

A `UITableView`'s `tableFooterView`property is a `UIView`object that is always displayed at the bottom of the content, below the last section. Even if that is not really clear in Apple's documentation (extract : "Returns an accessory view that is displayed below the table.").

If you want the footer to be static and non-floating, you have two easy choices :

- Not ideal but simple : Use the last section's footer view as your static footer. This will work at some conditions :

- your `UITableView` style must be `UITableViewStylePlain` (as `UITableViewStyleGrouped`gives the same behaviour to section headers/footers as to the `UITableView tableHeaderView` and `tableFooterView`

- You won't be able to use the last section footer for its real purpose : giving footer informations to a specific section

Here is a simple example :

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    UIView *view = nil;
    if (section == [tableView numberOfSections] - 1) {
        // This UIView will only be created for the last section of your UITableView
        view = [[UIView alloc] initWithFrame:CGRectZero];
        [view setBackgroundColor:[UIColor redColor]];
    }
    return view;
}

- Best solution right now : Add a UIView (either in code or in your XIB) at the same level as your `UITableView`. One little condition :

- The `self.view` property of your `UIViewController` must not be your `UITableView` object. That means you can't subclass `UITableViewController` but `UIViewController` and make your controller conform to `UITableViewDataSource` and `UITableViewDelegate` protocols. It's actually simpler than it looks and a better implementation (as far as I'm concerned) than using directly `UITableViewController`.

Here is a simple example in code (but you can do exactly the same using Interface Builder) :

ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

ViewController.m :

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) UIView *fixedTableFooterView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    CGFloat fixedFooterHeight = 200.0;

    // Initialize the UITableView
    CGRect tableViewFrame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds) - fixedFooterHeight);
    self.tableView = [[UITableView alloc] initWithFrame:tableViewFrame style:UITableViewStylePlain]; // or Grouped if you want...
    [self.tableView setDataSource:self];
    [self.tableView setDelegate:self];
    [self.view addSubview:self.tableView];

    // Initialize your Footer
    CGRect footerFrame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMaxY(self.view.bounds) - fixedFooterHeight, CGRectGetWidth(self.view.bounds), fixedFooterHeight); // What ever frame you want
    self.fixedTableFooterView = [[UIView alloc] initWithFrame:footerFrame];
    [self.fixedTableFooterView setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:self.fixedTableFooterView];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    [self setTableView:nil];
    [self setFixedTableFooterView:nil];
}

@end

You can also specify `UIViewAutoresizing` mask to make it work seamlessly in portrait and landscape but I didn't to complicate this rather simple code.

WARNING : This .h and .m files won't compile as I didn't put in the `UITableViewDataSource` required methods. Comment the `setDataSource:` line if you want to see it in action.

Hope this will help,

Feel free to ask me other details,

Problem

Im Looking to get my footer to Float over a table view So that it is Always Visible and not only when i scroll to the bottom. i have tried resizing the table view using this code : ``` - (id)initWithStyle:(UITableViewStyle)style { if ((self = [super initWithStyle: style])) { UIView *footer = [[UIView alloc] initWithFrame: CGRectMake(0, 0, 1, 45)]; footer.backgroundColor = [UIColor clearColor]; self.tableView.tableFooterView = footer; self.tableView.frame = CGRectMake(0, 0, 320, 100); footer.hidden = NO; } ``` I have had no luck thus far. I have also tried Using other windows and resizing all the .XIB files.

Original source

Related problems