【问题标题】:UISearchController searchBar frame only resizes on first clickUISearchController searchBar 框架仅在第一次点击时调整大小
【发布时间】:2023-04-11 05:46:01
【问题描述】:

我刚刚在常规 UIViewController 中实现了一个 UISearchController,我遇到了一个奇怪的问题。

我有一个 UIView,它完全适合我希望 UISearchBar 采用的大小。在第一次启动视图时,我将 UISearchBar 作为 SubView 添加到此 UIView。 但是当我启动它时, UISearchBar 不会占用其父 UIView 的大小——它只占用整个屏幕的宽度。

如您所见,它与右侧的按钮重叠。

但是一旦我点击搜索栏并取消它,它就会调整到我想要的确切大小。

这可能是什么问题?我尝试将 SearchBar 中的 AutoLayout Constraints 添加到其父视图,但它似乎没有改变任何东西。 [UIView addSubview:] 不处理这个吗?

【问题讨论】:

    标签: ios objective-c uiview uisearchcontroller


    【解决方案1】:

    UISearchController 的视图行为确实很奇怪,但有一个简单的解决方法。

    • 使用额外的容器视图
    • 把 UISearchController 的视图放进去
    • 将 UISearchController 的视图自动调整掩码设置为 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
    • 将 UISearchController 的框架设置为容器的视图边界

    此时 UISearchController.view 的大小不会超出 container.bounds。

    【讨论】:

    • 感谢您的留言!我不太明白——这就是我现在正在做的事情,对吧?我已经将 SearchBar 添加到我的容器中!
    • 如果我现在理解正确,您的容器是最顶层视图控制器(又名 visibleVC.view)的视图,其中添加了 uiseachcontroller.view 作为它的子视图。我建议添加额外的容器视图(屏幕的宽度约为 80%,高度等于 uiseachcontroller.view)作为 visibleVC.view 的子视图。然后将 uisearchcontroller 视图添加到这个新创建的容器视图中。
    • 我已经有一个容器视图,它具有第二张图片中 UISearchBar 的确切大小——这就是我添加 UISearchController 的 UIView。这就是为什么我不明白它 - 我点击一次后它可以工作,但在第一次启动时它不起作用。
    • 您是否尝试过将自动调整大小的遮罩灵活宽度和灵活高度应用到 uisearchcontroller.view 并将其框架设置为容器视图边界?
    • 'searchController.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; searchController.searchBar.frame = searchBarView.bounds;'令人惊讶的是,它完美地工作。非常感谢。请将其发布为答案,我会接受!
    【解决方案2】:

    对我来说这不起作用,但我找到了一个我想分享的解决方案:

    不是将searchBar放在containerView中,而是将navigationBar放在containerView中,将searchBar放在这个navigationBar中。对我来说,这个问题仍然存在。

    然后我将一个 1 像素宽的视图作为导航项放在导航栏的右侧。从那时起一切正常,第一次选择后,searchBar 的文本字段不再拉伸。

    这更像是一种 hack,而不是一个解决烦人 bug 的好方法(?),但对我来说,这种 hack 是可以接受的,因为我已经需要在 searchBar 的两侧留出一些边距。这是一些代码:

    //在初始化或viewDidLoad上

    navigationBar = UINavigationBar(frame: .zero)
    
    let navigationItem = UINavigationItem()
    navigationItem.titleView = searchController.searchBar
    
    let leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: Design.margin, height: 1))
    leftView.backgroundColor = .clear
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: leftView)
    
    let rightView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: Design.margin, height: 1))
    rightView.backgroundColor = .clear
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightView)
    
    
    navigationBar.items = [navigationItem]
    
    containerView.addSubview(navigationBar)
    

    // 在布局中设置帧大小

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多