改变UISearchBar放大镜图标的颜色和位置

5
我有一个UISearchBar,我想改变初始放大镜图标的位置(出现在UISearchBar中间的那个图标)以及颜色或图标。
到目前为止,我已经更改了色调和图标图像。
然而,新的图标仅在模拟器上测试应用程序时显示,但在实际设备上(都运行iOS 9.3),它仍显示默认图标。
UISearchBar.appearance().setImage(UIImage(named: "SearchbarIcon"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal)

关于放大镜图标的位置,我希望它在左侧,只有在我激活UISearchBar时才会显示出来。

enter image description here

enter image description here

我在这里找到了很多答案,但其中许多提供的解决方案在iOS 8.0+上不起作用或者是Objective-C语言的,我对它们有些难以理解。
我尝试添加一个包含图标的自定义背景,但它出现在搜索栏的底部,而图标仍然存在:

enter image description here

如果我将Y轴的背景偏移量更改为-44(UISearchBar的高度),则背景会正常显示,但由于整个文本字段被推上去,我无法再输入。我还尝试将SearchText的垂直偏移量更改为44来进行补偿,但没有成功。说实话,我不确定Search Text和Background offsets应该做什么,但我决定尝试一下。

enter image description here

有没有什么方法可以实现这个?或者也许有不同的方法?

3个回答

7

谢谢。但据我所知,这会更改开始输入时出现的图标的位置,而不是初始搜索图标的位置。类似于这样:self.srcRegimenSearchBar.setPositionAdjustment(UIOffset(horizontal:0,vertical:0),forSearchBarIcon:UISearchBarIcon.Search)。我想要更改搜索栏中间图标的位置。 - daydr3am3r
啊,我明白了。好的,在过去,当UISearchBar的可配置性较低时,我通过迭代其子视图并找到其中包含的UITextField,并成为它的委托来插入自己的代码。这样可以让你获得很多位置回调的访问权限。https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/#//apple_ref/doc/uid/TP40006888-CH3-SW29 - Michael
OP是错误的。即使处于非活动状态,这也会改变searchBar的子视图的偏移量。感谢你,Michael。这是我第一次知道这件事。 :D 帮了我很多忙。 - Glenn Posadas
1
是的,这是正确的方法。Swift 5 版本示例:searchController.setPositionAdjustment(UIOffset(horizontal: 10, vertical: 0), for: UISearchBar.Icon.search) - nameless

3
您可以使用:
uiSearchBar.setPositionAdjustment(UIOffset, for: UISearchBar.Icon)

用您期望的偏移值 UIOffset(horizontal: CGFloat, vertical: CGFloat) 代替UIOffset并将 UISearchBar.Icon 替换为 .search


2
@Michael - 感谢您的所有帮助。我成功获取了UISearchBar的UITextField:
func customizeSearchBar()
{
    for subview in srcRegimenSearchBar.subviews
    {
        for view in subview.subviews
        {
            if let searchField = view as? UITextField
            {
                let imageView = UIImageView()
                let image = UIImage(named: "SearchBarIcon.png")

                imageView.image = image;
                imageView.frame = CGRectMake(0, 0, 0, 0)

                /*imageView.frame = CGRectMake(100, 0, 20, 19)*/

                searchField.leftView = imageView
                searchField.leftViewMode = UITextFieldViewMode.Always
            }
        }
    }
}

我想改变位置,因为我可以访问框架,但似乎只有顶部和高度可以修改,至少按照我尝试的方式是这样的,所以我将高度和宽度设置为0(我找不到一种方法使其为nil或完全删除),并在UISearchbar的左侧添加了一个新图标的UIImageView,并为色调添加了自定义水平偏移量。

不是最好的解决方案,我确定,但现在它能用。

enter image description here

enter image description here


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