iOS 如何使用两个固定部分和一个动态表格视图进行布局?

Posted

技术标签:

【中文标题】iOS 如何使用两个固定部分和一个动态表格视图进行布局?【英文标题】:iOS how to do a layout with two fixed sections and a dynamic tableview? 【发布时间】:2017-10-25 11:17:47 【问题描述】:

我目前正在尝试创建我之前为 android 制作的应用程序的 ios 版本。在 Android 版本中,我有一个 LinearLayout,我可以在其中添加我需要的任何其他布局(其中一个是 RecyclerView,用于显示用户通过对话框在该特定页面上添加的数据),它工作得很好。我现在正在尝试在 iOS 上复制它,但遇到了一些困难。

到目前为止我尝试过的事情: 滚动视图 > 堆栈视图 > 堆栈视图中的动态表视图以显示用户添加的数据 - 到目前为止,每次尝试都失败了 - 就好像 Xcode 做它想做的任何事情,而不是我要求它做的事情. 5 个数字中随机分配的高度和宽度并不少见。我可以显示内容,但它完全拒绝滚动。我已经确保我已经将滚动视图的顶部、底部前导和尾随设置为超级视图,因为我看到的许多教程都指示我这样做,并且堆栈视图也有与滚动视图相同宽度的约束,但仍然没有.

静态表视图 > 静态单元格之一中的动态表视图 - 这里的问题是我不希望动态表可滚动,我希望这是其中任何内容的高度,所以如果有没有内容我基本上不希望它不存在,如果有 1 行,我希望它显示 1 行,如果有 3 行,我希望它显示所有 3 行,而无需对外部表视图中的行进行单独的滚动操作。

基本上,我正在浏览一个长长的可滚动屏幕,在动态表的上方和下方都有 UI 元素(理想情况下是静态表格视图或任何可以让它们在此时显示的视图!)视图,动态表格视图的长度正好适合添加到其中的内容。像这样的事情可以在 iOS 中完成吗?

编辑:请附上我正在尝试模拟的 Android 端 UI 的图片。 RecyclerView 位于第三方详情按钮和三个相机按钮之间。

【问题讨论】:

可以放你的UI图片吗? 添加了我正在尝试模拟的 Android 端的图片。我还没有任何可以在 iOS 端显示的屏幕截图,Interface Builder 只是隐藏了你显示的所有内容,并且项目当前不处于可编译状态。 【参考方案1】:

也许你应该使用 UITableView,正如 cmets 建议的那样:

func numberOfSections(in tableView: UITableView) -> Int 
    return 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return textViewCount + isCamera == true ? 1:0//



func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if indexPath.row == cameraRow 
        return cameraCell //suggest addSubview UICollectionView do this
    else
        return textViewCell
    


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    if indexPath.row == cameraRow 
        return cameraCount / 3 * cameraHeight
    else
        return textViewHeight
    

在Objective-C中,我用这个来计算字符串的大小:

@implementation NSString (FIDExtra)

- (CGSize)sizeWithTextMaxSize:(CGSize)textMaxSize font:(UIFont *)font

    CGSize textSize = CGSizeZero;

    if (self.length > 0)
    
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

        NSDictionary *attributesDic = @NSFontAttributeName: font,
                                        NSParagraphStyleAttributeName: paragraphStyle;

        CGRect textRect = [self boundingRectWithSize:textMaxSize
                                             options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                          attributes:attributesDic
                                             context:nil];

        textSize = CGSizeMake(CGRectGetWidth(textRect), ceilf(CGRectGetHeight(textRect)));
    

    return textSize;


@end

我尝试使用 swift,但我不确定是否有用:

extension String 
    func sizeWithTextMaxSize(textMaxSize:CGSize,font:UIFont) -> CGSize 
        var textSize = CGSize.zero
        if self.count > 0 
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineBreakMode = .byWordWrapping
            let attri = NSAttributedString.init(string: self, attributes: [NSAttributedStringKey.font:font])
            let textRect = attri.boundingRect(with: textSize, options: [.usesLineFragmentOrigin,.usesFontLeading], context: nil)
            textSize = CGSize.init(width: textRect.size.width, height: textRect.size.height)
        
        return textSize
    

【讨论】:

谢谢,我相信这会派上用场,但我正在寻求帮助实现的部分是相机按钮上方的部分。我可能会使用collectionview来做到这一点,我已经在其他地方的应用程序中使用它了。 使用` optional public func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat`并计算字符串的大小

以上是关于iOS 如何使用两个固定部分和一个动态表格视图进行布局?的主要内容,如果未能解决你的问题,请参考以下文章

如何动态增加滚动视图中两个表格视图的高度

如何设置 UITableView 部分保持固定?

如何创建动态表格视图我想知道

带有图像视图和标签的 iOS UITableViewCell 动态大小的表格视图单元格

如何在表格视图中取消固定表格视图部分标题

iOS - 表格视图 - 静态单元格(分组) - 更改部分标题文本颜色