8

我有一个 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];,但更改仍会应用在动画中。

4

6 回答 6

2

@user3429963 肯定是在寻找正确的方向。这对我有用:

searchBar.becomeFirstResponder()
searchBar.removeLayerAnimationsRecursively()

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

extension UIView {

  func removeLayerAnimationsRecursively() {
    layer.removeAllAnimations()
    subviews.forEach { $0.removeLayerAnimationsRecursively() }
  }
}
于 2016-12-06T18:13:16.603 回答
0

这是一个黑客,但如果你不能没有它。

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

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

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

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

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

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

[self.searchBar setText:@""];
于 2013-11-06T17:36:47.737 回答
0

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

于 2014-06-30T16:34:01.360 回答
0

Use this code to hide icon of search bar :-

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

Take transparent image with searchIcon.jpg name and your icon hide its work for me

[searchBar setText:@""];
于 2015-07-22T06:43:33.497 回答
0
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)
}
于 2018-08-15T20:14:00.823 回答
-1

它对我有用(仅在 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
于 2014-03-17T17:21:57.863 回答