我正在开发一个应用程序,其中我将UISearchBar放在包含UIViewControllerUITableViewController的顶部。 UISearchBar过滤UITableView的内容。

到目前为止,我没有做任何事情(除了自定义颜色以匹配我的应用程序的主题,这已经够难了!),但是在iPhone 4/5以外的任何设备上,UISearchBar都太小了。

因此,我正在尝试更新字体的大小和内部UITextField的高度。

事实证明,所有这些都非常困难,需要大量定制。因此,如果您知道可以简化此操作的库,请在评论中告诉我。

这是我现在正在使用的代码:

// In a category for UISearchBar
- (void)setup {
    self.tintColor              = [UIColor offWhite];
    for (UIView *view in self.subviews) {
        [self configureView:view];
    }
}
- (void)configureView:(UIView *)view {
    if ([view isKindOfClass:[UITextField class]]) {
        CGFloat fontSize, frameHeight;
        if (IS_IPHONE_4) {
            fontSize            = 14.0f;
            frameHeight         = 24.0f;
        } else if (IS_IPHONE_5) {
            fontSize            = 14.0f;
            frameHeight         = 24.0f;
        } else if (IS_IPHONE_6) {
            fontSize            = 17.0f;
            frameHeight         = 28.0f;
        } else if (IS_IPHONE_6PLUS) {
            fontSize            = 20.0f;
            frameHeight         = 32.0f;
        } else {
            // iPad
            fontSize            = 24.0f;
            frameHeight         = 36.0f;
        }
        UITextField *textfield  = (UITextField *)view;
        textfield.font          = [UIFont buttonFontOfSize:fontSize];
        textfield.textColor     = [UIColor offWhite];
        textfield.tintColor     = [UIColor offWhite];
        CGRect frame            = textfield.frame;
        frame.origin.y          = (self.frame.size.height - frameHeight) / 2.0f;
        frame.size.height       = frameHeight;
        textfield.frame         = frame;
    }
    if (view.subviews.count > 0) {
        for (UIView *subview in view.subviews) {
            [self configureView:subview];
        }
    }
}

注意:我以这种方式构造代码,以防Apple更改UISearchBar的内部结构。我不想对索引值进行硬编码。

因此,此代码“有效”,因为最终结果是我想要的,即,具有指定大小的文本的更高的UISearchBar和指定的内部UITextField也更高。我不了解是到达那里的过程。
  • 如果我在一般的AutoLayout过程中调用[self.searchBar setup],则无法正常工作(内部UITextField的高度错误)。这对我来说很有意义,因为在实际布局视图之前,框架是(0,0,0,0)
  • 如果我在[self.searchBar setup]方法中调用-viewWillAppear:,则无法正常工作(内部UITextField的高度错误)。因为调试显示帧仍然是(0,0,0,0),所以对我来说不是,但我认为在布局和设置所有内容后都会调用-viewWillAppear:
  • 如果我在[self.searchBar setup]方法中调用-viewDidLayoutSubviews,则它“正常”运行,但是内部UITextField从“正常”高度开始,然后在实际显示视图后的某个时间“跳转”到正确的高度。

  • 我使用纯AutoLayout在代码中设置了整个UIViewController。我简直无法按照我希望的方式来设置UISearchBar,然后再将视图完成加载并显示在屏幕上。过去我看过一些时髦的东西,但是我一直能够强迫视图按需渲染。 UISearchBar在幕后有什么特别的地方吗?有人知道如何完成这项工作吗?

    最佳答案

    您在同一视图上混合了自动布局和手动布局(someView.frame = …)。你不能那样做。

    相反,要更改高度,请将视图的高度约束上的constant设置为frameHeight。让自动布局引擎为您设置框架。

    关于ios - UISearchBar-内部UITextField高度问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28311219/

    10-13 04:17