当前位置:  开发笔记 > IOS > 正文

更改UISearchBar TextField的大小?

如何解决《更改UISearchBarTextField的大小?》经验,为你挑选了6个好方法。

我有一个带有索引的UITableView; 我想为它添加一个UISearchBar,但索引与"x"重叠以清除搜索.我已经注意到在Contacts应用程序中,UISearchBar中的文本字段被调整大小以适应这一点,但我无法弄清楚如何在我自己的应用程序中执行此操作.

我在viewDidLoad中尝试了以下内容,但它似乎不起作用.

UITextField * textField = (UITextField *)[[self.search subviews] objectAtIndex:0];
CGRect r = textField.frame;

[textField setFrame:CGRectMake(r.origin.x, r.origin.y, r.size.height, r.size.width-30)];

有任何想法吗?



1> Mike..:

它比所有这些建议容易得多.在界面构建器中,您可以放置​​View,而不是将搜索栏作为表视图的标题.然后,在此视图中放置导航栏.抓住导航栏的左侧调整大小手柄并将其向右拉,直到NB仅为25像素宽.清除NB中的标题(双击以选中它,然后删除).然后,将搜索栏添加到同一视图中.将其右侧调整大小手柄向左移动,调整使其与N B相邻.就是这样.

如果需要,也可以启用取消按钮,它也不会与索引重叠(保留在搜索栏中).

显然,表格视图在其标题中只能有1个子视图,这就是为什么你需要先放置视图,然后放入NB和搜索栏.

更新:请参阅Apress的iPhone开发.SDK 3版本的241.您只需在搜索时禁用索引.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (isSearching) {
        return nil;
    }
    return keys;
}

他们还谈到在索引顶部添加放大镜.

好书周围.



2> Nick Farina..:

为什么不只是将实际的UISearchBar水平放大,并将(空)UINavigationBar放在它的右边?它们将呈现完全相同的背景.

比攻击可能改变的Apple对象的内部更好.

此外,在动画UISearchBar的宽度时,您会注意到内部文本字段不随其动画.您可以通过在更改其框架后调用动画块中的UISearchBar的"layoutSubviews"来解决此问题.(这就是确定内部文本字段大小的位置)



3> Padraig..:

好的,我想出了一个解决方案.

    创建UISearchBar的子类

    在drawRect:方法中包含此代码.

    UITextView * textField = [self.subviews objectAtIndex:0];
    textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31); 
    
    [super drawRect:rect];
    

注意:kRightSideMargin是我在头文件中设置的常量; 我把它设置为25.

感谢大家的建议.


我使用v3.0 iphone SDK并将此代码放在drawRect中不起作用.实际上对我有用的是将此代码放在layoutSubviews中.不完全确定原因 - 我能得出的唯一结论是v2 - > v3有变化

4> 小智..:

正如Padraig所指出的,你要做的就是将searchBar子类化.创建您的UISearchBar子类,并将以下代码添加到layoutSubviews方法中:

- (void)layoutSubviews
{
    UITextField *searchField;

    for(int i = 0; i < [self.subviews count]; i++)
    {
        if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]])
        {
            searchField = [self.subviews objectAtIndex:i];
        }
    }

    if(!(searchField == nil))
    {
        searchField.frame = CGRectMake(4, 5, 285, 30); 
    }
}

这将遍历所有子视图并根据类型UITextField进行检查.这样一来,如果它在其子视图的排列中移动,这仍然会抓住它.我发现285只是足够宽,不会与我的tableView的索引重叠.



5> Ernie Thomas..:

从iOS 6开始,导航栏解决方案对我来说效果不佳,因为现在UISearchBar和UINavigationBar之间的外观略有不同.因此,我通过子类化UISearchBar切换到类似于Padraig的方法.

@interface SearchBarWithPad : UISearchBar
@end


@implementation SearchBarWithPad
- (void) layoutSubviews {

    [super layoutSubviews];
    NSInteger pad = 50;
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass: [UITextField class]])
        view.frame = CGRectMake (view.frame.origin.x, view.frame.origin.y, view.frame.size.width - pad, view.frame.size.height);
    }   
}
@end

编辑:啊,我还没试过,但我想你可以设置一个导航栏的clipToBounds = YES来关闭它的新阴影,从而在两个控件之间再次创建一致的外观.



6> Besi..:

我使用的观景台,并要显示一个UISearchBar leftController.

现在的问题是如果我打开包含导航的左侧,右侧的位与我的搜索字段重叠.

我通过写过去UISearchBar除了这个,文本字段将始终具有相同的宽度,但在一种情况下,ViewDeck重叠,在另一种情况下,我隐藏ViewDeck位,然后取消按钮将占用空间:

子类化UISearchBar

#import "ViewDeckSearchBar.h"
#define kViewDeckPadding 55

@interface ViewDeckSearchBar()
@property (readonly) UITextField *textField;
@end

@implementation ViewDeckSearchBar

static CGRect initialTextFieldFrame;

- (void) layoutSubviews {

    [super layoutSubviews];

    // Store the initial frame for the the text field
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        initialTextFieldFrame = self.textField.frame;
    });

    [self updateTextFieldFrame];
}

-(void)updateTextFieldFrame{

    int width = initialTextFieldFrame.size.width - (kViewDeckPadding + 6);
    CGRect newFrame = CGRectMake (self.textField.frame.origin.x,
                                  self.textField.frame.origin.y,
                                  width,
                                  self.textField.frame.size.height);

    self.textField.frame = newFrame;
}

-(UITextField *)textField{
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass: [UITextField class]]){
            return (UITextField *)view;
        }
    }

    return nil;
}

@end

ViewController类

在我的Navigation类中,我需要覆盖这两个UISearchbarDelegate方法,以便使用搜索结果进入全屏:

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{

    [self.viewDeckController setLeftSize:0];

    // I am also using scopes, which works fine (they fade out when not searching)
    self.searchBar.scopeButtonTitles = @[@"Food",
                                         @"Beverages",
                                         @"Misc"];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
    self.viewDeckController.leftSize = 55;
}

结果

ViewDeck显示在右侧:

http://i5.minus.com/jA34MnXVqPZez.png

在全屏搜索(按钮和范围按钮是动画的).

一个http://i2.minus.com/jjKEgXLur1kH6.png

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有