ios - iOS 中具有多个 TableView 的屏幕的容器 View ?

标签 ios swift uitableview design-guidelines

我有一个 UI,如屏幕截图所示。我目前已经使用 tableviews 完成了这项工作。屏幕是一个带有 4 行静态原型(prototype)单元格的表格 View 。一个用于包含个人资料图像的标题,下一个用于个人资料简介,第三行用于收藏夹、订阅、事件图像按钮,最后一行用于内容,这是另一个表格 View 。

最喜欢的部分

fav

订阅部分

sub

我为内容使用了一个内部表格 View ,收藏夹、订阅和事件中的所有元素都在一个单元格中。一次加载,我隐藏其他元素并根据图标点击仅显示一个元素。

问题是收藏夹部分的单元格高度不一致。标签中有多行时会有间隙。在订阅部分,最后一项触及标签栏。

我已禁用外部表格 View 的滚动,因此只有内部表格 View (内容部分)滚动,这在较小的屏幕上并不令人愉快。

class ProfileViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        profileTableView = ProfileSectionTableView()  // inner table view
        profileTableView.profileDelegate = self
        profileSectionTableView.delegate = profileTableView
        profileSectionTableView.dataSource = profileTableView
        profileSectionTableView.rowHeight = UITableView.automaticDimension
        profileSectionTableView.estimatedRowHeight = 44
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        switch (indexPath.row) {
        case 0:
            return 176
        case 1:
            return 72
        case 2:
            let height = self.view.frame.height - (176 + 72 + (self.tabBarController?.tabBar.frame.height)! + 8)
            return height
        default:
            return UITableView.automaticDimension
        }
    }

    override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 44
    }
}

内容节表查看代码为:

class ProfileSectionTableView: UITableView, UITableViewDelegate, UITableViewDataSource, ProfileSectionViewDelegate {
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let cell = updateTableCell(tableView, indexPath) as! ProfileCell
        var height = UITableView.automaticDimension
        if (ProfileData.profileViewType == .favourite) {
            height = cell.favouritesTitleLabel.text!.height(withConstrainedWidth: cell.favouritesTitleLabel.frame.width - 64, font: UIFont(name: "Roboto", size: 17.0)!) + 28
        } else if (ProfileData.profileViewType == .subscription) {
            height = cell.subscriptionTitleLabel.text!.height(withConstrainedWidth: cell.subscriptionTitleLabel.frame.width - 64, font: UIFont(name: "Roboto", size: 17.0)!) + 16
        }
        return height
    }

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

    // ...
}
extension String {
    func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
        let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)

        return ceil(boundingBox.height)
    }
}

如何修复单元格之间的间隙?我将标签行设置为 0。如何为这样的屏幕布局 UI 元素?以上方法是否正确?或者我应该为这些部分使用带有容器 View 的 UIViewController 吗?

关于这个的相关问题How to change the cell height of inner table view cell in iOS?

最佳答案

依赖于你的工作,我对屏幕中的 tableView 很友好。 然后使用 composionSection:[[String:Any]] 数据设置 tableView;任何一项都是节的数据。例如:收藏夹、订阅... 对于部分:我为部分、headSection、页 footer 分设置 keyId,当然还有单元格部分。 您可以滚动到其他部分的顶部。

例如:

// MARK: UITableViewDataSource

var composionSection = [[String: Any]]() 

extension CountryDetailViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
    return composionSection.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if let componentSection = self.composionSection[section] as? [String:Any]{
        if let keyId = componentSection[kId] as? String, let object = componentSection[kObject] as? [String:Any] {
            if keyId == kFavourites || keyId == kSubscription{
                return object.count
            }
        }
    }
    return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let componentSection = self.composionSection[indexPath.section] as? [String:Any]{
        if let keyId = componentSection[kId] as? String, let object = componentSection[kObject] as? [String:Any] {
            if keyId == kFavourites {
                let cell = tableView.dequeueReusableCell(withIdentifier: identifierForViewCell, for: indexPath) as! ViewFavourites
                return cell
            }
            else if keyId == kSubscription {
                let cell = tableView.dequeueReusableCell(withIdentifier: identifierForViewCell, for: indexPath) as! ViewSubscription
                return cell
            }
        }
    }
    return UITableViewCell()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if let componentSection = self.composionSection[section] as? [String:Any]{
        if let keyId = componentSection[kId] as? String, let object = componentSection[kObject] as? [String:Any] {
            if keyId == kFavourites {
                let sectionView = UIView()
                return sectionView
            }
            else if keyId == kSubscription {
                let sectionView = UIView()
                return sectionView
            }
        }
    }
    return nil
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if let componentSection = self.composionSection[section] as? [String:Any] {
        if let keyId = componentSection[kId] as? String {
            if keyId == kFavourites {
                return 80
            }
            else if keyId == kSubscription {
                return 64 // or other
            }
        }
    }
    return 0
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

关于ios - iOS 中具有多个 TableView 的屏幕的容器 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848771/

相关文章:

iphone - UITextField resignFirstResponder 不工作?

ios - Font Awesome Swift : "Ambiguous Use of Code"

swift - 使用dispatch_async动画重新加载tableviewcell

iphone - 如何在初始化后定义 UITableViewCell 样式?

ios - ScrollToItemAtIndexPath 有时不起作用

ios - NSPredicate:获取最高值

swift - _ : vs _ String: when writing functions 的区别/用例是什么

swift - fatal error : Not enough bits to represent the passed value

swift - 如何在捕获中打印错误

ios - 当调用某些函数时变量消失