简体   繁体   中英

Change frame of UISearchBar programatically when orientation changes

I have a search button and when user clicks it I am displaying UISearchBar programmatically. Width of Searchbar is (200) not full screen. I am searching like a MSWord and displaying the content in searchbar' tableview. But when user is in middle of search and changed orientation how should I control the search bar width, ie, self.searchDisplayController.searchBar.frame and self.searchDisplayController.searchResultsTableView.frame.

Below is the piece of code that used to create the searchbar:

-(IBAction)searchBar:(id)sender
{
    if(!searching)
    {
        searching = YES;
        sBar.frame = CGRectMake(500, 50,250, 44);
        [self.view addSubview:sBar];
        [searchController setActive:YES animated:YES];
        [sBar becomeFirstResponder];

        if((currentOrientation == UIInterfaceOrientationLandscapeLeft)  || 
           (currentOrientation ==  UIInterfaceOrientationLandscapeRight))
        {
            self.searchDisplayController.searchBar.frame = CGRectMake(755, 50, 250, 44);
        }
        else 
        {
            self.searchDisplayController.searchBar.frame = CGRectMake(500, 50, 250, 44);
        }
    }
}


- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
    /*
     Bob: Because the searchResultsTableView will be released and allocated automatically, so each time we start to begin search, we set its delegate here.
     */
    [self.searchDisplayController.searchResultsTableView setDelegate:self];
    [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:204/255.0 alpha:1.0]];
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{
    /*
     Hide the search bar
     */

    float animateTime = 0.3;
    CGRect viewFrame = sBar.frame;
    viewFrame.origin.y -= (viewFrame.size.height);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:animateTime];

    sBar.frame = viewFrame;

    [UIView commitAnimations];
    [self performSelector:@selector(animationDone) withObject:nil afterDelay:0.3];

}

-(void)animationDone
{
    [sBar removeFromSuperview];
    searching = NO;
}


-(void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView 
{
    if((currentOrientation == UIInterfaceOrientationLandscapeLeft)  || 
       (currentOrientation ==  UIInterfaceOrientationLandscapeRight))
    {
        tableView.frame = CGRectMake(755, 100, 250, 400);
    }
    else 
    {
        tableView.frame = CGRectMake(500, 100, 250, 400);
    }
}



- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    currentOrientation = toInterfaceOrientation;



    if((currentOrientation == UIInterfaceOrientationLandscapeLeft)  || 
       (currentOrientation ==  UIInterfaceOrientationLandscapeRight))
    {

        //Search
        btnSearch.frame = CGRectMake(920, 5, 40, 40);

        self.searchDisplayController.searchBar.frame = CGRectMake(755, 50, 250, 44);
        self.searchDisplayController.searchResultsTableView.frame = CGRectMake(755, 100, 250, 400);
    }
    else 
    {

        //Search
        btnSearch.frame = CGRectMake(666, 5, 40, 40);

        self.searchDisplayController.searchBar.frame = CGRectMake(500, 50, 250, 44);
        self.searchDisplayController.searchResultsTableView.frame = CGRectMake(500, 100, 250, 400);
    }
}

I am able to create and functionality which is working fine. But only issue is when user change the orinentation its not properly setting searchbar' width. My application needs to be delivered this friday. Please answere me asap.

Answering my question to close this thread as well to help others.

(1) In willRotateToInterfaceOrientation its able to set UISearchBar origin. Width is coming as 768 (full screen width of iPad in Portrait) but origin seems to be set here.

(2) After orientation change finished we can set the search bar width. With small animation it will be smooth resize.

(3) I am calling resetFrame at both pre & post orientation APIs to avoid some sudden JURK kind for searchBar.

Below is the solution i used for my app..

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    currentOrientation = toInterfaceOrientation;



    [self resetSearchResourcesFrames];  // Set the origin of UISearchBar
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [UIView beginAnimations:@"" context:nil]; //Animation for smooth resizing of search tableview only
    [UIView setAnimationDuration:0.2];
    [self resetSearchResourcesFrames];  // Width rotation only possible after rotation
    [UIView commitAnimations];
}

-(void)resetSearchResourcesFrames
{
    if(([buttonGridViewController sharedInstance].currentOrientation == UIInterfaceOrientationLandscapeLeft)  || 
       ([buttonGridViewController sharedInstance].currentOrientation ==  UIInterfaceOrientationLandscapeRight))
    {
        //Search
        btnSearch.frame = CGRectMake(920, 5, 40, 40);

        self.searchDisplayController.searchBar.frame = CGRectMake(755, 50, 250, 44);
        self.searchController.searchResultsTableView.frame = CGRectMake(755, 100, 250, 400);
    }
    else 
    {
        //Search
        btnSearch.frame = CGRectMake(666, 5, 40, 40);

        self.searchDisplayController.searchBar.frame = CGRectMake(500, 50, 250, 44);
        self.searchController.searchResultsTableView.frame = CGRectMake(500, 100, 250, 400);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM