在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画

Posted

技术标签:

【中文标题】在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画【英文标题】:Disable UISearchBar search icon and placeholder text animation on becomeFirstResponder 【发布时间】:2013-11-18 01:33:26 【问题描述】:

我有一个 UISearchBar,我想在用户点击按钮时显示它。在 buttonPress 方法中,我创建了 searchBar 并将其添加为子视图,然后调用 [searchBar becomeFirstResponder]。如果我取出这个 becomeFirstResponder 调用,搜索图标和占位符文本会出现在 textField 的中心。

然后,当搜索栏成为第一响应者时,两者都以动画方式左对齐。

因为我连续执行这两个操作,所以我得到了一个奇怪的动画,其中图标和占位符从 (0,0) 开始动画。

如何禁用此动画,以便我可以简单地将第二张图片添加到我的视图中?

编辑:

我让占位符文本通过使用正确显示

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar

    [searchBar setPlaceholder:@"Type Here to Search"];

我可以使用[searchBar setPositionAdjustment:UIOffsetMake(x, y) forSearchBarIcon:UISearchBarIconSearch]; 移动搜索图标,但更改仍会应用到动画中。

【问题讨论】:

【参考方案1】:

这是一个 hack,但如果没有它你就活不下去。

编辑:如果你也想要占位符文本,你可以这样做。

最初将占位符文本设置为@" ",然后

[self.searchBar setText:@"Place holder"];

[self.searchBar setPlaceholder:@"Place holder"];

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor grayColor]];

在它成为第一响应者之后,

[self.searchBar setText:@""];

【讨论】:

为什么要设置占位符文本,使用文本 我需要占位符文本,因此当用户开始输入时,它会消失并替换为输入的字符。对于搜索图标,我可以使用 [setPositionAdjustment:forSearchBarIcon] 将其动画到指定位置,但它仍然使用动画。 占位符文本将居中对齐。我认为你无法改变这一点 不,占位符文本在 textField 处于非活动状态时居中对齐,然后在成为 firstResponder 时动画到左对齐,然后当用户按下某个键时,它就会消失。然后它会在 textField 为空时重新出现。【参考方案2】:

它对我有用(仅在 ios7 上测试)

@interface SearchBar : UISearchBar
@end

@implementation SearchBar
- (void)layoutSubviews

    [super layoutSubviews];

    UITextField *textField = (UITextField *)[self firstSubviewOfClass:[UITextField class]];
    UIImageView *imageView = (UIImageView *)[textField firstSubviewMatchingBlock:^BOOL(UIView *obj) 
        return [obj isKindOfClass:[UIImageView class]] && obj.layer.animationKeys.count;
    ];
    [imageView.layer removeAllAnimations];
    UILabel *label = (UILabel *)[self firstSubviewOfClass:[UILabel class]];
    [label.layer removeAllAnimations];

@end

【讨论】:

【参考方案3】:

占位符末尾的一定数量的空格为我解决了这个问题。请注意,它应该是准确的空格数 - 不能少也不能多。

【讨论】:

【参考方案4】:

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

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

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

[searchBar setText:@""];

【讨论】:

【参考方案5】:

@user3429963 绝对是 looking 在正确的方向。这对我有用:

searchBar.becomeFirstResponder()
searchBar.removeLayerAnimationsRecursively()

其中removeLayerAnimationsRecursively() 是一个从视图层及其子视图层递归删除动画的函数:

extension UIView 

  func removeLayerAnimationsRecursively() 
    layer.removeAllAnimations()
    subviews.forEach  $0.removeLayerAnimationsRecursively() 
  

【讨论】:

【参考方案6】:
override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    UIView.setAnimationsEnabled(false)
    self.searchController?.isActive = true
    self.searchController?.searchBar.becomeFirstResponder()


func didPresentSearchController(_ searchController: UISearchController) 
    searchController.searchBar.becomeFirstResponder()
    UIView.setAnimationsEnabled(true)

【讨论】:

以上是关于在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画的主要内容,如果未能解决你的问题,请参考以下文章

becomeFirstResponder 在 iOS 8 中不起作用

在UITableViewController中textfield.becomeFirstResponder()不滚动tableview

becomeFirstResponder 在 ios 11 中不显示键盘

UITableView 没有在 becomeFirstResponder 上滚动

UITextField 子类在 becomeFirstResponder 抛出奇怪的异常

在 becomeFirstResponder 上禁用 UISearchBar 搜索图标和占位符文本动画