Strange UISearchDisplayController view offset behavior in iOS 7 when embedded in navigation bar

前端 未结 9 954
难免孤独
难免孤独 2020-12-14 03:13

I am building an iOS 7-only app. I am trying to set a UISearchDisplayController into the navigation bar.

I have it set up like this: In the storyboard, I added a \"

相关标签:
9条回答
  • 2020-12-14 03:35

    Unfortunately none of the above solutions worked for me, I'm using a UITableViewController.

    This link helped:

    http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/

    I put the code below for convenience:

    static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
        if (!view || classNameSuffix.length == 0) return nil;
    
        UIView *theView = nil;
        for (__unsafe_unretained UIView *subview in view.subviews) {
            if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
                return subview;
            }else {
                if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
            }
        }
        return theView;
    }
    
    - (void)correctSearchDisplayFrames {
        // Update search bar frame.
        CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
        superviewFrame.origin.y = 0.f;
        self.searchDisplayController.searchBar.superview.frame = superviewFrame;
    
        // Strech dimming view.
        UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
        if (dimmingView) {
            CGRect dimmingFrame = dimmingView.superview.frame;
            dimmingFrame.origin.y = self.searchDisplayController.searchBar.frame.size.height;
            dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.origin.y;
            dimmingView.superview.frame = dimmingFrame;
        }
    }
    
    - (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
        [UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
            for (UIView *view in self.tableView.subviews) {
                if (view != self.searchDisplayController.searchResultsTableView &&
                    view != self.searchDisplayController.searchBar) {
                    view.alpha = hidden ? 0.f : 1.f;
                }
            }
        }];
    }
    
    // This fixes UISearchBarController on iOS 7. rdar://14800556
    - (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
        if (PSPDFIsUIKitFlatMode()) {
            [self.navigationController setNavigationBarHidden:beginSearch animated:YES];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self correctSearchDisplayFrames];
            });
            [self setAllViewsExceptSearchHidden:beginSearch animated:YES];
            [UIView animateWithDuration:0.25f animations:^{
                self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
            }];
        }
    }
    
    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
        [self correctFramesForSearchDisplayControllerBeginSearch:YES];
    }
    
    - (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
        [self correctSearchDisplayFrames];
    }
    
    - (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
        [self correctFramesForSearchDisplayControllerBeginSearch:NO];
    }
    
    - (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
        // HACK: iOS 7 requires a cruel workaround to show the search table view.
        if (PSPDFIsUIKitFlatMode()) {
            controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
        }
    }
    
    0 讨论(0)
  • 2020-12-14 03:42

    I had a same problem. And I solve this issue with adding view object under the tableview.

    1. Add new ViewController on the Storyboard
    2. Drag TableView to the new VC
    3. Drag Table Cell to the TableView
    4. Make a Connection for TableView DataSource, TableView Delegate to the new VC
    0 讨论(0)
  • 2020-12-14 03:43

    I remember running into the same exact problem that you are observing.There could be a couple of solutions you can try.

    • If you are using storyboards You should click on the view controller or TableView Controller which you have set up for your tableview and go to its attribute inspector and look under ViewController section and set the Extend Edges section to be under Top Bars.

    • If you are not using storyboards you can manually set the settings using the viewcontrollers edgesForExtendedLayout property and that should do the trick. I was using storyboards.

    0 讨论(0)
提交回复
热议问题