6

我正在尝试为待办事项列表类型的应用程序制作详细信息屏幕。以下是详细信息屏幕当前的样子:

详细画面

这是一个UICollectionViewController, 带有一个标题。标头包含 2 个UILabel对象和一个UITextView对象。这些对象的布局由一个垂直的UIStackView. AUIView用于设置白色背景。

UICollectionReusableView在运行时定义它的高度时遇到了一些困难。任何建议表示赞赏。

4

2 回答 2

3

这有点像黑客,但似乎有效。

    // showhere to keep a reference
    UICollectionReusableView * _cachedHeaderView;


    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
               viewForSupplementaryElementOfKind:(NSString *)kind 
                                     atIndexPath:(NSIndexPath *)indexPath{

        if(!_cachedHeaderView){
            // dequeue the cell from storyboard
            _cachedHeaderView = 
         [collectionView dequeueReusableCellWithReuseIdentifier:@"header_cell" 
                                                   forIndexPath:indexPath];

            // set captions/images on the header etc...

            // tell the collectionview to redraw this section
          [self.collectionView reloadSections:[NSIndexSet 
                            indexSetWithIndex:indexPath.section]];
        }

        return _cachedHeaderView;
    }


        - (CGSize)collectionView:(UICollectionView *)collectionView 
                          layout:(UICollectionViewLayout*)collectionViewLayout        
 referenceSizeForHeaderInSection:(NSInteger)section{

        // once there is a reference ot the view, use it to figure out the height
        if(_cachedHeaderView){
            CGSize size = 
[_cachedHeaderView systemLayoutSizeFittingSize:collectionView.bounds.size 
                 withHorizontalFittingPriority:UILayoutPriorityRequired 
                       verticalFittingPriority:UILayoutPriorityDefaultLow];
            return size;

        }

        // a placeholder value just to get the dequeueReusableCellWithReuseIdentifier to work 
        return CGSizeMake(collectionView.bounds.size.width, 100);
    }

于 2017-08-12T11:28:41.500 回答
0

以下是如何在没有 XIB 文件的情况下使用自动布局处理自定义 UICollectionViewReusableView。

  1. 实现referenceSizeForHeaderInSection委托方法。
  2. 在其中,实例化您用作标题视图的视图。
  3. 将其可见性设置为隐藏,以避免闪烁。
  4. 将视图添加到集合视图的超级视图。
  5. 使用自动布局设置其布局,以匹配标题的预期视觉结果。
  6. 调用setNeedsLayoutlayoutIfNeeded
  7. 从超级视图中删除视图

注意:我不是这个解决方案的忠实拥护者,因为它每次都会将自定义视图添加到 collectionview 的超级视图中,以执行计算。我没有注意到任何性能问题。

注意#2:我将其视为临时解决方案,并在发布后迁移到自调整大小的补充视图。

我将PureLayout用于自动布局。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

    let header = CustomHeaderView()

        header.isHidden = true;
        self.view.addSubview(header)
        header.autoPinEdge(toSuperviewEdge: .leading)
        header.autoPinEdge(toSuperviewEdge: .trailing)
        header.autoPin(toTopLayoutGuideOf: self, withInset: 0)
        header.setupHeader(withData: self.data)
        header.setNeedsLayout()
        header.layoutIfNeeded()
        header.removeFromSuperview()

        return header.frame.size
}
于 2017-02-21T12:42:40.753 回答