Steve Ross
Steve Ross

Reputation: 4144

Creating a UISearchBar and UITableView inside a UIView

Disclaimer: I'm something of an iOS n00b. I have a navigation-based app -- i.e., in my AppDelegate, I create the nav frame:

self.navigation_controller = [[UINavigationController alloc] initWithRootViewController:home_view_controller];
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
self.window.rootViewController = navigation_controller;
self.window.makeKeyAndVisible;

Inside the frame of my home view, I want a search bar, then the scrollable table view. So, I wrote this:

- viewDidLoad{
  (HomeView*)home_view = [[HomeView alloc] init];
  self.view = home_view
  self.view.backgroundColor = [UIColor whiteColor]

  (UITableView*)self.table_view = [UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
  self.table_view.bounds.origin.y += 44;
  self.table_view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  self.table_view.dataSource = self;
  self.table_view.delegate = self;
  [self.view addSubview:self.table_view];

  search_frame = self.view.bounds;
  search_frame.origin.y = 48.0;
  search_frame.size.height = 48.0;

  self.search_bar = [[UISearchBar alloc] initWithFrame:search_frame)];
  [self.view addSubview:self.search_bar];
}

The table view displays fine, but occupies all the space below the navigation bar. I want to have the navigation bar, then immediately below it the search bar, followed by the table view. At the point of viewDidLoad, the UITableView does not yet have a non-zero bounding rect and I expect that's part of the problem. Additionally, I've specified UIViewAutoresizingFlexibleHeight in my autoresizingMask when I really want it glued against the search bar -- again, I believe this may be part of the problem.

What have I misunderstood here?

Thanks

Upvotes: 1

Views: 1449

Answers (2)

8Ours
8Ours

Reputation: 132

Steve,

Try following changes:

1) Set tableview's frame using:

CGRect targetRect = CGRectMake(0, 48, self.view.frame.size.width, self.view.frame.size.heigth);
(UITableView*)self.table_view = [UITableView alloc] initWithFrame:targetRect style:UITableViewStylePlain];

2) Add following autosize mask also:

// This value will anchor your table view with top margin
UIViewAutoresizingFlexibleBottomMargin

3) Set searchbar's frame to following rect frame:

CGRecttMake(0, 0, self.view.frame.size.width, 48);

Upvotes: 1

Ladislav
Ladislav

Reputation: 7283

What I would do, is just add the UISearchBar as the first UITableView header.

(method: tableView:viewForHeaderInSection:)

Check this blog post: http://jainmarket.blogspot.com/2009/08/add-searchbar-as-uitableviews-header.html

Upvotes: 0

Related Questions