UISearchBar的范围栏背景图片可以设置,但是它的颜色不能设置?

4
    for subView in searchBar.subviews {
        if let scopeBar = subView as? UISegmentedControl {
            scopeBar.backgroundColor = UIColor.blueColor()
        }
    }

我一直尝试以上代码来获取对scopeBar的引用,随后设置其背景颜色,但我无法获得引用。它似乎只通过循环一次,这意味着搜索栏仅有一个子视图。在调试器中,搜索栏似乎具有名为_scopeBar的实例变量,类型为(UISegmentedControl*)。

    if let topView = searchBar.subviews.first {
        for subView in topView.subviews {
            if let cancelButton = subView as? UIButton {
                cancelButton.tintColor = UIColor.whiteColor()
                cancelButton.enabled = true
            }
        }
    }

第二段代码用于访问搜索栏的取消按钮。
3个回答

9

您可以将scopeBar背景图像设置为纯色图像。

首先,您需要从颜色创建UIImage。为了做到这一点,您可以创建一个函数或者一个UIImage扩展,例如下面的代码:

Swift 3

import UIKit

extension UIImage {
    class func imageWithColor(color: UIColor) -> UIImage {
        let rect: CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContextWithOptions(CGSize(width: 1, height: 1), false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

之后,您可以在范围栏上简单地设置backgroundImage:

Swift 3

// Set the scopeBar's background color:
searchBar.scopeBarBackgroundImage = UIImage.imageWithColor(color: UIColor.blue)

0

我有一个示例问题,我用以下代码进行了解决。

CGSize imageSize = CGSizeMake(64, 64);
UIColor *fillColor = [UIColor colorWithRed:228/255.0 green:228/255.0 blue:228/255.0 alpha:1.0];
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[fillColor setFill];
CGContextFillRect(context, CGRectMake(0, 0, imageSize.width, imageSize.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

self.searchController.searchBar.scopeBarBackgroundImage = image;

-1
- (void)changeScopeBarColor {
NSMutableArray<UIView*> *views = [NSMutableArray new];
NSArray<UIView *> *subviews = [_searchBar subviews];
[views addObjectsFromArray:subviews];
for (;;) {
    if (views.count == 0) {
        break;
    }

    UIView *v = [views firstObject];
    [views removeObject:v];

    if ([[[v class] description] isEqualToString:@"_UISearchBarScopeBarBackground"]) {
        v.backgroundColor = [UIColor whiteColor];
        break;
    }
    if (v.subviews.count > 0)
        [views addObjectsFromArray:v.subviews];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接