ios - 以编程方式使用自动布局将 subview 添加到 UICollectionView 不起作用

标签 ios objective-c uicollectionview autolayout uisearchbar

我有一个 UICollectionViewController从 Storyboard设置并使用流布局。到目前为止,它工作正常,即它的布局和单元格按预期工作。

现在,我正在尝试添加 UISearchBar作为 UICollectionView 的 subview .这就是我添加搜索栏的方式:

流布局的sectionInset设置为 UIEdgeInsetsMake(44, 0, 0, 0)为搜索栏腾出空间。

并在 viewDidLoad 中添加以下代码:

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 768.0, 44.0f)];
    // have also tried [[UISearchBar alloc] init] here.
[self.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.collectionView addSubview:self.searchBar];

NSDictionary* viewDict = @{@"mySearchBar": self.searchBar};

NSArray* sHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mySearchBar]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewDict];


NSArray* sVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mySearchBar(==44)]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict];

[self.collectionView addConstraints:sHorizontal];
[self.collectionView addConstraints:sVertical];

约束非常简单。 searchBar 的左、右和上边缘固定在 super View 的左、右和上边缘,其高度为 44。

问题是运行此代码时搜索栏不可见。我记录了 searchBar 的帧值在 viewDidAppear并发现它的框架设置为 (0, 0, 0, 44) 即宽度没有得到解决。

我还尝试了可视格式字符串 H:|[mySearchBar(>=768)]|在这种情况下 searchBar是可见的并且在它的位置,但不会在方向变化时调整大小,即在横向上也保持 768 点宽。

我在这里做错了什么?应该怎么做才能使所需的布局约束起作用?

我正在 iPad 模拟器 iOS 7.1 上尝试这个。

我也尝试将搜索栏添加到标题 View ,但它的行为与我需要的不同。

最佳答案

解决了!

我仍然不确定为什么以前的方法不起作用,但我得到了这样的预期结果:

NSDictionary* viewDict = @{@"mySearchBar": self.searchBar, @"myCollView": self.collectionView};

NSArray* sHorizontal = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mySearchBar(==myCollView)]|"
                                                               options:0
                                                               metrics:nil
                                                                 views:viewDict];


NSArray* sVertical = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mySearchBar(==44)]"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDict];

[self.collectionView addConstraints:sHorizontal];
[self.collectionView addConstraints:sVertical];

注意可视格式字符串 H:|[mySearchBar(==myCollView)]|这意味着搜索栏的宽度应该等于 Collection View 的宽度。 Collection View 被添加到 viewDict字典为 myCollView .这按预期工作,搜索栏会根据方向更改调整大小。

需要注意的几点,之前我也使用 constraintWithItem: 尝试了同样的事情。 NSLayoutConstraint 的方法类(class)。虽然 api 相当容易理解,但它只创建一个约束。所以我们必须根据所需的约束数量多次调用它,这可能很乏味。不仅如此,就我而言,用这种方法设置“等宽”约束会崩溃,我不知道为什么。

另一方面,constraintsWithVisualFormat:返回满足可视格式字符串中的条件所需的所有约束的数组。

关于ios - 以编程方式使用自动布局将 subview 添加到 UICollectionView 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211280/

相关文章:

ios - 如何检查有效的时间格式?

swift - UICollectionViewCell的 subview 绝对框架

iphone - UICollectionView:一行或一列

iOS 内部安装图标不会消失

ios - 从 NIB 加载 View 返回零帧 View - 怎么办?

ios - 为什么我的 collectionViewCell 显示异常行为?

ios - 将新的 UIImage 添加到 SubView 需要很长时间

ios - Xcode 错误 - dyld : Library not loaded won't resolve

ios - UISearchController 类似于 Apple map

ios - UIImageView 使其他 View 不一致