【发布时间】:2013-12-12 15:02:55
【问题描述】:
我有一个UIViewController,它确实在它的-viewDidLoad 方法中添加了一个UISearchBar 和一个UITableView,作为它的view 属性的子视图。添加这些之后,我使用如下可视格式语言创建约束:
NSDictionary *views = @{@"searchBar": [_searchController searchBar],
@"dataTable": [self tableView]};
NSArray *horizontalSearchBarConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|"
options:0
metrics:nil
views:views];
NSArray *horizontalDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[dataTable]|"
options:0
metrics:nil
views:views];
NSArray *verticalSearchBarDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar(44)][dataTable]|"
options:0
metrics:nil
views:views];
NSMutableArray *allConstraints = [NSMutableArray new];
[allConstraints addObjectsFromArray:horizontalDataTableConstraints];
[allConstraints addObjectsFromArray:horizontalSearchBarConstraints];
[allConstraints addObjectsFromArray:verticalSearchBarDataTableConstraints];
[[self view] addConstraints:allConstraints];
阅读:宽度应该是整个屏幕的宽度,searchBar 的高度应该正好是 44,dataTable 的高度应该从searchBar 的底部延伸到视图的底部.
在此之前,我将这些视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO。 UIViewController 本身以模态视图呈现。我们说的是 iOS 6。
我得到的是:一个空的视图。就是纯白。
我错过了什么?我还是 Auto Layout 的新手,并尝试围绕它进行思考。
谢谢!
更新:添加整个-viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
BOOL translatesAutoreszingMaskIntoConstraints = NO;
[[self view] setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];
// manually create the search bar
UISearchBar *searchBar = [[UISearchBar alloc] init];
[searchBar setDelegate:self];
[searchBar setShowsCancelButton:NO];
[searchBar setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];
// create the search bar controller
_searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
[_searchController setDelegate:self];
[[_searchController searchResultsTableView] setDelegate:self];
[_searchController setSearchResultsDataSource:self];
[_searchController setSearchResultsDelegate:self];
// add the search bar
[[self view] addSubview:[_searchController searchBar]];
// manually create the table view and add it to the view
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
[_tableView setBackgroundView:nil];
[_tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched];
[_tableView setSeparatorColor:NEA_COLOR_MEDIUM_GREY];
[_tableView setBackgroundColor:NEA_COLOR_VIEW_BACKGROUND];
[_tableView setDataSource:self];
[_tableView setDelegate:self];
[_tableView setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];
[[self view] addSubview:[self tableView]];
// set up the layout using Auto Layout
NSDictionary *views = @{@"searchBar": [_searchController searchBar],
@"dataTable": [self tableView]};
NSArray *horizontalSearchBarConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|"
options:0
metrics:nil
views:views];
NSArray *horizontalDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[dataTable]|"
options:0
metrics:nil
views:views];
NSArray *verticalSearchBarDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar(44)][dataTable]|"
options:0
metrics:nil
views:views];
NSMutableArray *allConstraints = [NSMutableArray new];
[allConstraints addObjectsFromArray:horizontalDataTableConstraints];
[allConstraints addObjectsFromArray:horizontalSearchBarConstraints];
[allConstraints addObjectsFromArray:verticalSearchBarDataTableConstraints];
[[self view] addConstraints:allConstraints];
// add our little gradient
UIImage *shadow = [UIImage imageNamed:@"searchbar_bg_shadow"];
UIImageView *shadowView = [[UIImageView alloc] initWithImage:shadow];
[shadowView setFrame:CGRectMake(0, 44, 900, 14)];
[shadowView setBackgroundColor:[UIColor clearColor]];
[shadowView setTranslatesAutoresizingMaskIntoConstraints:YES];
[[self view] addSubview:shadowView];
// add the cancel button for the search bar
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ui_navigationbar_close"] style:UIBarButtonItemStyleBordered target:self action:@selector(cancel:)];
[[self navigationItem] setRightBarButtonItem:cancelButton];
// set a short back button title
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
}
更新:附加信息
封装UINavigationController 是通过情节提要创建的。在那里,将UIViewController 添加到我的班级,因为它是rootViewController。就是这样。
当我在该格式字符串中手动添加宽度时,它会显示视图。因此,当我手动指定尺寸时,它可以工作。但是,我想,我可以简单地使用框架来代替......
【问题讨论】:
-
你添加[[self view] addSubview:[_searchController searchBar]];[[self view] addSubview:[self tableView]];?控制台有错误吗?
-
是的,我是这样添加的,但不,不幸的是,我在控制台上没有任何错误。
-
我需要更多信息,你能分享你的代码吗?
-
没问题,更新了问题。
-
很奇怪,但你的代码对我来说是正确的。 MB你可以分享所有的项目吗?还是测试?
标签: ios6 uiviewcontroller modalviewcontroller nslayoutconstraint autolayout