zoukankan      html  css  js  c++  java
  • UISearchDisplayController 阴影遮盖frame调整

    iOS7中UISearchDisplayController 与UISearchBar结合使用时,有时候会出现搜索框获得焦点时,阴影遮盖部分挡住了搜索框,影响用户使用,如下图

    API中没有阴影图层的接口,尝试分析解决

    1、使用Reveal,查找遮盖图层,发现为_UISearchDisplayControllerDimmingView

    2、找到该图层,修改对应的frame,通过上图可以发现dimmingview与searchResultsTableView为同一视图的子图层。

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
       for(UIView * v in controller.searchResultsTableView.superview.subviews)
        {
            NSLog(@"%@",[v class]);
            if([v isKindOfClass:NSClassFromString(@"_UISearchDisplayControllerDimmingView")])
            {
                v.frame = CGRectMake(0,20,320,400); //
            }
        }

    }

     3、通过以上代码修改,遮罩图层没有在挡住搜索框了,但操作搜索框,还是发现搜索框的下区域不能获取焦点,Cancel按钮不方便使用。

    4、通过上个图可以看到虽然遮罩层下去了,但还是有个图层在挡住,左边列表该图层显示为searchResultsTableView的父视图,再次修改代码。

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
    {
        
        controller.searchResultsTableView.superview.bounds = CGRectMake(0,22,320,400);
        for(UIView * v in controller.searchResultsTableView.superview.subviews)
        {
            NSLog(@"%@",[v class]);
            if([v isKindOfClass:NSClassFromString(@"_UISearchDisplayControllerDimmingView")])
            {
                v.frame = CGRectMake(0,20,320,400); //
            }
        }
    }

     5、搜索框可以正常使用。

    6、同样,如果需要调整searchResultsTableView的frame,在追加下面的代码

    - (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView  {
        tableView.frame =CGRectMake(0, 20, 320, 480-64-44);
    }

     7、多次测试后发现,每次第一次执行无效,原因是由于searchDisplayControllerWillBeginSearch第一次执行时searchResultsTableView.superview为null,没有添加到父视图,可以使用两种方案解决

    方案一,延时执行:

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
    {
        NSLog(@"%@,%@",self.searchDisplayController.searchResultsTableView,self.searchDisplayController.searchResultsTableView.superview);
        
        [self performSelector:@selector(resetFrame) withObject:nil afterDelay:0.1];
    
    }
    
    - (void)resetFrame
    {
        CGRect bounds =  self.searchDisplayController.searchResultsTableView.superview.bounds;
        CGFloat offset = CGRectGetMinY(bounds);
        if (offset == 0)
        {
            self.searchDisplayController.searchResultsTableView.superview.bounds =CGRectMake(0,20,320,400);
        }
    
        for(UIView * v in self.searchDisplayController.searchResultsTableView.superview.subviews)
        {
            NSLog(@"%@",[v class]);
            if([v isKindOfClass:NSClassFromString(@"_UISearchDisplayControllerDimmingView")])
            {
                v.frame = CGRectMake(0,20,320,400); //
            }
        }
    }

    方案二,注册键盘通知:

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resetFrame)
                                                     name:UIKeyboardWillShowNotification object:nil];
    }
    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
        
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    }
    
    - (void)resetFrame
    {
        CGRect bounds =  self.searchDisplayController.searchResultsTableView.superview.bounds;
        CGFloat offset = CGRectGetMinY(bounds);
        if (offset == 0)
        {
            self.searchDisplayController.searchResultsTableView.superview.bounds =CGRectMake(0,20,320,400);
        }
    
        for(UIView * v in self.searchDisplayController.searchResultsTableView.superview.subviews)
        {
            NSLog(@"%@",[v class]);
            if([v isKindOfClass:NSClassFromString(@"_UISearchDisplayControllerDimmingView")])
            {
                v.frame = CGRectMake(0,20,320,400); //
            }
        }
    }

    问题解决!

    注:以上frame调整在ios7执行,ios7之前版本不需要,具体调整的frame大小可以根据自己的需求修改。

  • 相关阅读:
    性能测试四十五:性能测试策略
    性能测试四十四:性能优化思路
    性能测试四十三:数据库监控的指标
    性能测试四十二:sql案例之联合索引最左前缀
    性能测试四十一:sql案例之慢sql配置、执行计划和索引
    性能测试四十:Mysql存储过程造数据
    性能测试三十九:Jprofiler分析CPU过高和响应时间长的问题
    delphiIDE 把 window 桌面改慢后的 还原方法
    TStringList 善用 value['names'] 即使value 是带=号的值都没有关系呵呵 ,我靠 强,以后就用这个了,key=value首选
    TStringList,快速解析 查找测试。。。很有用,再也不用 FOR 循环了
  • 原文地址:https://www.cnblogs.com/geweb/p/UISearchDisplayControllerDimmingView.html
Copyright © 2011-2022 走看看