iOS 11上搜索栏内搜索文本字段的错误放置

时间:2017-09-15 14:10:50

标签: ios objective-c uinavigationitem uisearchcontroller ios11

我使用UISearchController作为导航栏的一部分,使用iOS 11中引入的新API。我在ViewController的viewDidLoad中以下列方式使用它

- (void)viewDidLoad {  
    [super viewDidLoad];  
    [_table setDataSource:self];  
    [_table setDelegate:self];  
    searchController = [[UISearchController alloc] initWithSearchResultsController:nil];  
    [self.navigationItem setSearchController:searchController];  
    [self.navigationItem setHidesSearchBarWhenScrolling:NO];  
    [searchController.searchBar setBackgroundColor:[UIColor greenColor]];  
} 

但是,搜索文本字段会在搜索栏内的错误位置呈现。请看下面的截图。

https://imgur.com/a/Igf49

我检查了视图层次结构,发现搜索栏中的UISearchBarTextField对象(不能直接访问devs)的frame.y值为1,这可能导致此问题。我已经在iOS 11 beta 10和iOS 11 GM上测试了这个。

这是一个已知问题吗?有没有解决这个问题?或者这是我在我的方面做错了什么?

任何帮助将不胜感激(:

2 个答案:

答案 0 :(得分:6)

此代码显示如何在iOS 11上的searchBar中更改textField的背景颜色。

<强>之前: Default state of iOS 11 searchBar

<强>后: enter image description here

Obj-C: in(void)viewDidLoad使用此代码:

 if (@available(iOS 11, *)) {
    UITextField *textField = [self.searchController.searchBar valueForKey:@"searchField"];
    UIView *backgroundView = textField.subviews.firstObject;
    backgroundView.backgroundColor = UIColor.whiteColor;
    backgroundView.layer.cornerRadius = 10;
    backgroundView.clipsToBounds = YES;
}
viewDidLoad()中的

Swift:使用此代码:

if #available(iOS 11.0, *) {
    if let textfield = scb.value(forKey: "searchField") as? UITextField {
        textfield.textColor = UIColor.blue

        if let backgroundview = textfield.subviews.first {
            backgroundview.backgroundColor = UIColor.white
            backgroundview.layer.cornerRadius = 10;
            backgroundview.clipsToBounds = true;
        }
    }
}

答案 1 :(得分:4)

无法访问您的图像(确切问题)。所以可以看到确切的问题。但是从你的陈述中,我发现了你的问题。我尝试跟随iOS 11及其正常工作。

我的代码解决了您的问题,但它在Swift中。您需要将其转换为Objective-C。你不难做到这一点。

 if #available(iOS 11.0, *) {
                let sc = UISearchController(searchResultsController: nil)
                sc.delegate = self
                let scb = sc.searchBar
                scb.tintColor = UIColor.white
                scb.barTintColor = UIColor.white


                if let textfield = scb.value(forKey: "searchField") as? UITextField {
                    textfield.textColor = UIColor.blue
                    if let backgroundview = textfield.subviews.first {

                        // Background color
                        backgroundview.backgroundColor = UIColor.white

                        // Rounded corner
                        backgroundview.layer.cornerRadius = 5;
                        backgroundview.clipsToBounds = true;

                    }
                }

                if let navigationbar = self.navigationController?.navigationBar {
                    navigationbar.barTintColor = UIColor.blue
                }
                navigationItem.searchController = sc
                navigationItem.hidesSearchBarWhenScrolling = false

    }

<强>输出:

enter image description here