iOS 7中UISearchBar中的UITextField

use*_*618 12 uinavigationbar uitextfield uisearchbar ios ios7

我正在尝试使用其中的TextField完成我的UISearchBar的相同外观,就像在我的iOS 6应用程序中一样.我试图用几种方式编写代码但尚未成功.问题是,自iOS 7以来,我无法以任何方式更改TextField的框架.结果是,我的TextField占用了NavigationBar中的所有空间并覆盖了右边的UIBarButtonItem(菜单按钮).见下图:

截图http://oi44.tinypic.com/2ufewx0.jpg

iOS 6代码: 这是我在iOS 6中编码的方式,我可以将TextFields框架设置为我喜欢的任何内容!

UITextField *sbTextField = (UITextField *)[searchBar.subviews lastObject];
[sbTextField removeFromSuperview];

CGRect rect = searchBar.frame;
rect.size.height = 32;
rect.size.width = 210;
sbTextField.frame = rect;

[sbTextField setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin];


UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc]  initWithCustomView:sbTextField];

[[self navigationItem] setLeftBarButtonItem:searchBarNavigationItem];
Run Code Online (Sandbox Code Playgroud)

iOS 7中上面代码的结果: [iOS 7外观]

iOS 7代码:iOS 7 的不同之处在于您需要使用子视图才能将UITextField添加到UISearchBar/UINavigationBar.通过这样做,我还没有能够改变它的框架.它目前与右侧的menuButton重叠,可以在下面的代码中看到...

UITextField* sbTextField;
CGRect rect = subView.frame;
rect.size.height = 32;
rect.size.width = 115;

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){

        if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {

            sbTextField = (UITextField *)ndLeveSubView;
            sbTextField.backgroundColor =[UIColor whiteColor];
            UIBarButtonItem *searchBarNavigationItem = [[UIBarButtonItem alloc] initWithCustomView:sbTextField];
            sbTextField.frame = rect;
            self.navigationItem.leftBarButtonItem = searchBarNavigationItem;
            self.navigationItem.rightBarButtonItem =  menuButton;
            [sbTextField removeFromSuperview];

             break;
        }

    }

 }
 [self.searchBar reloadInputViews];
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 那么......是否可以以任何方式更改子视图的框架(TextField)?:(

编辑

答案有点蹩脚.为了使代码在ios7中使用TextField右侧的按钮,TextField必须设置为navigationBar的titleView.在ios 6中不是这种情况.但是会有其他故障,不建议在iOS7的searchBars中使用TextField.请改用searchDispalyController.我的答案如下

 self.navigationItem.titleView = sbTextField;
Run Code Online (Sandbox Code Playgroud)

Adn*_*tab 13

在iOS 7中访问文本字段,你必须在更多级别上重申.像这样更改你的代码

for (UIView *subView in self.searchBar.subviews){
    for (UIView *ndLeveSubView in subView.subviews){
    if ([ndLeveSubView isKindOfClass:[UITextField class]])
        {
            searchBarTextField = (UITextField *)ndLeveSubView;
            break;
        }
    }
   }
Run Code Online (Sandbox Code Playgroud)

但是,清除UISearchBar的backgournd并在文本字段中设置搜索栏图标的最佳方法是:

[searchBar setBackgroundImage:[[UIImage alloc] init] ];//if you want to remove background of uisearchbar
UIImage *image = [UIImage imageNamed: @"search_icon.png"];
[searchBar setImage:image forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)


Dis*_*Dev 13

你不应该把一个UITextFieldUINavigationBariOS中7,这个小部件已经由苹果公司提供.

在iOS 7中,您只需使用UISearchDisplayControllera UISearchBar,并设置:

searchDisplayController.displaySearchBarInNavigationBar = YES
Run Code Online (Sandbox Code Playgroud)

搜索栏将显示在您的内容中UINavigationBar,并且UIBarButtonItem在原始iOS 6解决方案中没有所有黑客和手动框架大小的情况下,它将与其他搜索栏一起使用.

有一点需要注意 - 如果您要将此项添加到仍支持早于iOS 7的操作系统的项目中,您需要确保对检查进行检查,否则在旧操作系统上运行时应用程序将崩溃.

if([searchDisplayController respondsToSelector:@selector(displaysSearchBarInNavigationBar)])
{
    searchDisplayController.displaysSearchBarInNavigationBar = YES;
}
Run Code Online (Sandbox Code Playgroud)

请参阅iOS 7过渡指南的此部分:https: //developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

在iOS 7中,UISearchDisplayController包含displaysSearchBarInNavigationBar属性,您可以使用该属性将搜索栏放在导航栏中,类似于iPhone上的Calendar中的搜索栏:

另外一个注意事项 - 您应该考虑将其迁移到AutoLayout,这样您就不必进行所有繁琐的帧操作.Apple推荐它,并且可能有充分的理由(未来具有更大屏幕的设备......?)


use*_*618 -3

感谢spotdog13。我最终成功地通过以下方式使其在 iOS 7 上正常工作:

#define TABLE_BOTTOM_MARGIN 5
#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

@interface HomeViewController ()

@end

@implementation HomeViewController

@synthesize searchBar;
@synthesize searchResults;

- (void)viewDidLoad
{
 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {


    [searchBar sizeToFit]; // standard size
    searchBar.delegate = self;

    // Add search bar to navigation bar
    self.navigationItem.titleView = searchBar;
    }
}

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
// Manually activate search mode
// Use animated=NO so we'll be able to immediately un-hide it again
[self.searchDisplayController setActive:YES animated:NO];
// Hand over control to UISearchDisplayController during the search
// searchBar.delegate = (id <UISearchBarDelegate>)self.searchDisplayController;

return YES;
}

#pragma mark <UISearchDisplayDelegate>
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController
 // Un-hide the navigation bar that UISearchDisplayController hid
[self.navigationController setNavigationBarHidden:NO animated:NO];
}

- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController
                                           *)controller {
searchBar = (UISearchBar *)self.navigationItem.titleView;
// Manually resign search mode
[searchBar resignFirstResponder];
// Take back control of the search bar
searchBar.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)