【问题标题】:Removing the image on the left of an UISearchbar删除 UISearchbar 左侧的图像
【发布时间】:2010-07-14 10:42:16
【问题描述】:

我可以删除UISearchbar 左侧的图片并添加新图片吗?

【问题讨论】:

  • 请澄清您的问题。很难理解你想问什么。也许发布您遇到困难的代码,或者发布一些截图来帮助您解释。
  • 在 Uisearchbar 中有文本字段和搜索图像。我可以删除该搜索图像并在该位置添加新图像

标签: iphone uisearchbar


【解决方案1】:

在 iOS 5.0+ 中,您可以使用自定义搜索栏图像

- (void)setImage:(UIImage *)iconImage forSearchBarIcon:(UISearchBarIcon)icon state:(UIControlState)state

在 UISearchBar 的特定实例中或使用 UIAppearance 代理的一组实例中。

【讨论】:

  • 注意:如果您试图完全摆脱图像(即不将其替换为其他内容),那么此方法将不起作用,因为如果将其设置为 nil,它将获胜'实际上并没有删除图像。
  • 你也可以给一个非零图片属性:[_searchBar setImage:[UIImage new] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
  • 这可行,但是推荐的将文本重新对齐到左边缘的方法是什么?
  • 要重新对齐文本,您可以使用[[UISearchBar appearance] setPositionAdjustment:UIOffsetMake(-10, 0) forSearchBarIcon:UISearchBarIconSearch];
  • searchTextPositionAdjustment 在 iOS 12 上不需要。setPositionAdjustment 将右侧的“删除”按钮移至左侧。 [UISearchBar appearance] 打破了其他搜索栏。
【解决方案2】:

要完全删除图标,可以使用以下代码行:

目标-C:

// Remove the icon, which is located in the left view
[UITextField appearanceWhenContainedIn:[UISearchBar class], nil].leftView = nil;

// Give some left padding between the edge of the search bar and the text the user enters
[UISearchBar appearance].searchTextPositionAdjustment = UIOffsetMake(10, 0);

斯威夫特:

// Remove the icon, which is located in the left view
UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).leftView = nil

// Give some left padding between the edge of the search bar and the text the user enters
UISearchBar.appearance().searchTextPositionAdjustment = UIOffsetMake(10, 0)

【讨论】:

  • 第二行在 iOS 12 上无法正常工作。它还破坏了其他搜索栏。
【解决方案3】:
// hide magnifying glass
    UITextField* searchField = nil;
    for (UIView* subview in searchBar.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            searchField = (UITextField*)subview;
            break;
        }
    }
    if (searchField) {
        searchField.leftViewMode = UITextFieldViewModeNever;
    }

这隐藏了放大镜。效果很好。

【讨论】:

  • 这并不能解决 iOS 12 上的空白区域代替已删除图标的问题。
【解决方案4】:

在 swift 2.0 中这样做:

let textFieldInsideSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
textFieldInsideSearchBar.leftViewMode = UITextFieldViewMode.Never

【讨论】:

  • 这也很有效,如果你想在每个控件的基础上使用它
  • 为什么有人认为可以接受的答案涉及valueForKey?这可能会导致应用被拒绝。
  • @CiprianRarau 所以你的意思是,你是在用不可靠的脆弱代码推广一个答案,绕过一个正确的解决方案,并且在 Apple 的自动代码分析之外容易被应用程序拒绝......太棒了。 ...从本质上讲,你刚刚确认了为什么你不应该宣传这样的事情作为答案。
  • @TheCodingArt 在这种情况下,我建议您使用 Rostyslav 的答案。它遍历子视图并找到第一个 UITextField。但我想知道您知道实现此功能的最干净的方法是什么?问候
【解决方案5】:

Swift 4 解决方案

searchBar.setImage(UIImage(), for: .search, state: .normal)

【讨论】:

  • 这并不能解决 iOS 12 上已删除图标的空白空间问题。
【解决方案6】:

或者在 Swift 4.0 中简单的单行:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).leftViewMode = .never

注意:这将从包含在UISearchBars 中的所有UITextFields 中删除左侧图标。

【讨论】:

  • 它在 iOS 12 上留下空白区域代替图标。
  • 它也打破了项目中的其他搜索栏。
【解决方案7】:

Swift 4 解决方案:

searchBar.setImage(UIImage(), for: .search, state: .normal)

您可能还想调整左侧的间隙:

searchBar.setPositionAdjustment(UIOffset(horizontal: -20, vertical: 0), for: .search)

【讨论】:

  • 这会将右侧的“删除”按钮移至左侧。
【解决方案8】:

How to change the position or hide magnifier icon in UISearchBar in IOS 7?

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setLeftViewMode:UITextFieldViewModeNever];

【讨论】:

  • 这是迄今为止最简单的方法
  • 这并不能解决 iOS 12 上已删除图标的空白区域问题。它还会破坏项目中的其他搜索栏。
【解决方案9】:

将搜索栏图标替换为 1x1 透明图片并偏移文本位置

UIImage *blank = [UIImage imageNamed:@"blank"];
[self.searchBar setImage:blank forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
self.searchBar.searchTextPositionAdjustment = UIOffsetMake(-19, 0);

【讨论】:

  • searchTextPositionAdjustment 在 iOS 12 上不需要。顺便问一下,为什么是 19 而不是 20?
【解决方案10】:

我在 iOS 12 和 13 上尝试了所有答案 - 没有一个在两个版本上都能正常工作。唯一正确答案如下:

searchField.leftViewMode = .never
if #available(iOS 13.0, *) {
    searchTextPositionAdjustment = UIOffset(horizontal: -20, vertical: 0);
}

【讨论】:

    【解决方案11】:

    你可以使用

    searchBar.setImage(UIImage(), for: .search, state: .normal)
    

    【讨论】:

    • 请将代码格式化为使用 4 个空格或 `-characters 的代码。也请解释你的答案,而不是仅仅用一行代码来回答。
    【解决方案12】:

    你可以继承 UISearchBar 然后使用这个方法:

    - (void)setTextFieldLeftView:(UIView *)view
    {
        UITextField *searchField = nil;
        for (UIView *subview in self.subviews)
        {
            if ([subview isKindOfClass:[UITextField class]])
            {
                searchField = (UITextField *)subview;
                break;
            }
        }
    
        if (searchField != nil) 
        {
            searchField.leftView = view;
        }
    }
    

    【讨论】:

    • 这并不能解决 iOS 12 上的空白区域代替已删除图标的问题。
    【解决方案13】:

    在 Swift 中删除搜索图标使用这个:

    searchBar.setImage(UIImage(), for: .search, state: .normal)
    

    用自定义图像更改UIImage() 替换您的图像。

    【讨论】:

    • 您的评论帮助了我。 ty
    【解决方案14】:

    使用此代码隐藏搜索栏的图标:-

    [searchBarItems setImage:[UIImage imageNamed:@"searchIcon.jpg"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
    

    使用 searchIcon.jpg 名称获取透明图像并隐藏您的图标 它为我工作

    【讨论】:

    • 这并不能解决用空格代替已删除图标的问题。
    【解决方案15】:

    你不能轻易移除图片,但你可以轻松插入 UIImageView 来替换图片,如下所示:

    UIImageView *searchIcon = [[UIImageView alloc] initWithImage:[MBUIFactory imageNamed:@"ic_search_normal.png"]];
    searchIcon.frame = CGRectMake(10, 10, 24, 24);
    [self.searchBar addSubview:searchIcon];
    [searchIcon release];
    

    记住——生活就是作弊;)...

    图像必须完全像素对齐(使用像素),或者新图像必须具有白色背景,在此需要隐藏原始图像但不干扰搜索栏的其余部分(如果您只需为整个图像使用白色背景,左角会干扰背景。

    【讨论】:

    • 它没有删除图标 - 它正在替换它。
    【解决方案16】:

    在 ios6 中至少有一个[searchbar setImage:<#(UIImage *)#> forSearchBarIcon:<#(UISearchBarIcon)#> state:<#(UIControlState)#>]

    你可以设置的属性:)

    【讨论】:

    • 它没有删除图标 - 它正在替换它。
    【解决方案17】:

    对于特定的UISearchBar 实例。

    目标-C:

    // Get the inner search field.
    UITextField *searchField = (UITextField *)[searchBar valueForKey:@"searchField"];
    
    // Hide the left search icon.
    [searchField setLeftViewMode:UITextFieldViewModeNever];
    

    【讨论】:

    • 这并不能解决 iOS 12 上已删除图标的空白空间问题。
    【解决方案18】:
    let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: textfield.frame.size.height))
    textfield.leftView = paddingView
    textfield.leftViewMode = .always
    

    此解决方案去除了放大镜以及填充物。

    【讨论】:

    • “这应该是公认的答案”你自己的回答听起来很奇怪:)
    【解决方案19】:

    swift 5.0,xCode 12 你接下来可以做:
    searchBar.setImage(UIImage(), for: .search, state: .normal)

    【讨论】:

      【解决方案20】:

      如果你指的是放大镜,那么不是。没有公共 API 可以更改或删除它。只需改用UITextField

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2016-05-30
        • 2021-04-13
        相关资源
        最近更新 更多