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

iOS如何使用两个固定分区和一个动态表视图进行布局?,ios,swift,uitableview,uiscrollview,uistackview,Ios,Swift,Uitableview,Uiscrollview,Uistackview,我目前正在尝试创建一个iOS版本的应用程序,这个应用程序是我以前为Android开发的。在Android版本中,我有一个线性布局,在那里我可以添加任何我需要的额外布局(其中之一是一个RecyclerView,用于显示用户通过对话框在特定页面上添加的数据),它工作得很好。我现在正努力在iOS上复制它,但有些困难 到目前为止我已经尝试过的事情: 在堆栈视图中滚动视图>堆栈视图>动态表视图以显示用户添加的数据-到目前为止,每次尝试都失败了-就好像Xcode做了它想做的事情,而不是我要求它做的事情。随机

我目前正在尝试创建一个iOS版本的应用程序,这个应用程序是我以前为Android开发的。在Android版本中,我有一个线性布局,在那里我可以添加任何我需要的额外布局(其中之一是一个RecyclerView,用于显示用户通过对话框在特定页面上添加的数据),它工作得很好。我现在正努力在iOS上复制它,但有些困难

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

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

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


编辑:请在附件中找到我试图模仿的Android端UI的图片。RecyclerView位于第三方详细信息按钮和三个摄像头按钮之间。

也许您应该使用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
    }
}

也许您应该使用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
    }
}

你能把你的UI图片放进去吗?添加了一张我试图模仿的Android端的图片。我还没有在iOS端显示任何screenshottable,Interface Builder只是隐藏了您显示的所有内容,并且项目当前未处于可编译状态。您可以将您的UI图片放入其中吗?添加了我尝试模拟的Android端的图片。我还没有在iOS端显示任何screenshottable,Interface Builder只是隐藏了您显示的所有内容,并且项目当前未处于可编译状态。谢谢,因为我相信这会很方便,但我正在寻找帮助实现的部分是摄像头按钮上方的部分。我可能会使用collectionview来实现这一点,我已经在其他地方的应用程序中使用了它。使用`可选的public func tableView(u tableView:UITableView,heightForHeaderInSection:Int)->CGFloat`并计算字符串的大小谢谢,因为我相信这会派上用场,但是,我正在寻找帮助实现的部分是摄像头按钮上方的部分。我可能会使用collectionview来实现这一点,我已经在其他地方的应用程序中使用了它。使用`可选的public func tableView(u tableView:UITableView,heightForHeaderInSection:Int)->CGFloat`并计算字符串的大小