iOS如何使用两个固定部分和动态tableview进行布局?

时间:2017-10-25 11:17:48

标签: ios swift uitableview uiscrollview uistackview

enter image description here我目前正在尝试创建我以前为Android制作的应用程序的iOS版本。在Android版本中,我有一个LinearLayout,我可以在其中放入我需要的任何其他布局(其中一个是RecyclerView,用于显示用户通过对话框在该特定页面上添加的数据),它只是工作正常。我现在试图在iOS上复制它有一些困难。

到目前为止我尝试过的事情: 滚动视图>堆栈视图>堆栈视图中的动态表视图显示用户添加的数据 - 到目前为止,每次尝试执行此操作都失败了 - 好像Xcode做了他们想要的任何事情,而不是我要求它做什么。随机分配的5个数字的高度和宽度并不罕见。我可以显示内容,但它显示拒绝滚动。我已经确定我已经将scrollview顶部,底部前导和尾随设置为superview,因为我看到的许多教程都指示我这样做,并且堆栈视图也有一个约束,滚动视图的宽度相等但仍然没有

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

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

编辑:请附上我试图模仿的Android端UI的图片。 RecyclerView位于第三方详细信息按钮和三个相机按钮之间。

1 个答案:

答案 0 :(得分:0)

也许您应该使用UITableView,如在建议的评论中那样:

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
    }
}