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 如何使用两个固定部分和一个动态表格视图进行布局?的主要内容,如果未能解决你的问题,请参考以下文章