Ios UISearchBar-内部UITextField高度问题

Ios UISearchBar-内部UITextField高度问题,ios,objective-c,uisearchbar,Ios,Objective C,Uisearchbar,我正在开发一个应用程序,其中我在包含UITableViewController的UIViewController顶部放置了一个UISearchBar。UISearchBar过滤UITableView的内容 到目前为止,我没有做任何事情(除了定制颜色以匹配我的应用程序的主题,这已经够难了!),但是在除iPhone4/5之外的任何东西上,UISearchBar明显太小了 因此,我正在尝试更新字体大小和内部UITextField的高度 事实证明,所有这些都很难实现,需要相当多的定制。因此,如果你知道一

我正在开发一个应用程序,其中我在包含
UITableViewController
UIViewController
顶部放置了一个
UISearchBar
UISearchBar
过滤
UITableView
的内容

到目前为止,我没有做任何事情(除了定制颜色以匹配我的应用程序的主题,这已经够难了!),但是在除iPhone4/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];
        }
    }
}
注意:我以这种方式构建代码,以防苹果更改
UISearchBar
的内部结构。我不想硬编码索引值

因此,这段代码“有效”,因为最终的结果就是我想要的,即一个更高的
UISearchBar
,文本大小按规定,内部
UITextField
也按规定更高。我不明白的是到达那里的过程

  • 如果我在常规自动布局过程中调用
    [self.searchBar setup]
    ,它将不起作用(内部
    UITextField
    的高度错误)。这对我来说很有意义,因为在视图实际布局之前,框架是
    (0,0,0,0)
  • 如果在我的
    -视图中调用
    [self.searchBar setup]
    ,将显示:
    方法,它不起作用(内部
    UITextField
    的高度错误)。这个对我来说没有意义,因为调试显示帧仍然是
    (0,0,0,0)
    ,但我认为
    -视图将出现:
    是在布局和设置所有内容时调用的
  • 如果我在我的
    -viewdilayoutsubviews
    方法中调用
    [self.searchBar setup]
    ,它会“工作”,但内部
    UITextField
    会开始“正常”高度,然后在视图实际出现一段时间后“跳”到正确的高度

  • 我使用纯自动布局在代码中设置整个
    UIViewController
    。在视图完成加载并显示在屏幕上之前,我无法按照我想要的方式设置
    UISearchBar
    。我以前见过一些时髦的东西,但我总是能够强制视图按需要渲染。
    UISearchBar
    的幕后是否有什么特别之处?有人知道如何做到这一点吗?

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


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

    我认为情况并非如此。我知道你在说什么,但我只是用AutoLayout做“外部”视图。而且,不管怎样,它“起作用”,就像我说的,它只是在视图显示后到达那里,但是
    ui搜索栏的总体高度始终是正确的。