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

时间:2013-11-06 17:15:17

标签: ios animation uisearchbar placeholder becomefirstresponder

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

enter image description here

然后,当搜索栏成为第一响应者时,两个动画都是左对齐的。

enter image description here

因为我正在连续做两个动作,所以我得到了一个奇怪的动画,其中图标&占位符动画来自(0,0)。

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

修改

我使用

正确显示了占位符文本
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [searchBar setPlaceholder:@"Type Here to Search"];
}

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

6 个答案:

答案 0 :(得分:1)

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

removeLayerAnimationsRecursively()

其中extension UIView { func removeLayerAnimationsRecursively() { layer.removeAllAnimations() subviews.forEach { $0.removeLayerAnimationsRecursively() } } } 是一个从视图图层及其子视图中删除动画的函数。层递归:

<!-- Base application theme. -->
<style name="TransparentTheme" parent="android:Theme.Holo.Light">
<!-- Customize your theme here. -->
<item name="android:windowBackground">@null</item>
<item name="android:actionBarStyle">@style/ActionBarStyle.Transparent</item>
<item name="android:windowActionBarOverlay">true</item> 
</style>

<style name="ActionBarStyle.Transparent" parent="android:Widget.ActionBar">
<item name="android:background">@null</item>
<item name="android:displayOptions">showHome|showTitle</item>
<item name="android:titleTextStyle">@style/ActionBarStyle.Transparent.TitleTextStyle</item>
</style>

<style name="ActionBarStyle.Transparent.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">@android:color/white</item>
</style>

答案 1 :(得分:0)

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

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

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

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

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

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

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

[self.searchBar setText:@""];

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

使用searchIcon.jpg名称拍摄透明图像,并隐藏图标 它为我工作

[searchBar setText:@""];

答案 4 :(得分: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)
}

答案 5 :(得分:-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