tableView 在 UIView 内无法正确滚动

Posted

技术标签:

【中文标题】tableView 在 UIView 内无法正确滚动【英文标题】:tableView not scrolling properly inside UIView 【发布时间】:2019-12-17 10:44:15 【问题描述】:

我有一个以编程方式制作的 tableView。我初始化了部分和行的大小。我还在情节提要中放置了一个 containerView,其中包含 tableView。我的问题是,我的表格视图无法正确滚动。

这是我的故事板:

这将是我在故事板中的视图的出路:

@IBOutlet weak var trainingDetailsContainerView: UIView!

这将是我的初始化表:

var moduleLessonsTableView: UITableView = 
    let tableView = UITableView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
//    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.backgroundColor = Themes.gray_dec
    tableView.sectionHeaderHeight = 35
    tableView.rowHeight = 50
    tableView.isScrollEnabled = true
    tableView.register(TrainingModulesTableViewCell.self, forCellReuseIdentifier: "ModuleLessonsCell")

    return tableView
()

这里是我设置 tableView、高度和所有内容的地方:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(true)

    moduleLessonsTableView.frame = CGRect(x: 0, y: 0, width: trainingDetailsContainerView.frame.width, height: trainingDetailsContainerView.frame.height)

    trainingDetailsContainerView.addSubview(moduleLessonsTableView)

我可以尝试将它放在 viewWillAppear 中并且高度会正确呈现,这让我意识到 trainingDetailsContainerView 的边界设置在其他视图之前,我想。但它的问题是它会突然弹出。我真的不希望这样,因为从用户的角度来看,这似乎是一种滞后。

任何帮助将不胜感激。

我也无法标记视图生命周期,所以我将其放在这里。

【问题讨论】:

【参考方案1】:

尝试在viewDidLoad 中为您的表格视图添加约束,而不是设置框架。还要从viewWillAppear 方法中删除代码。 示例代码:

override func viewDidLoad() 
    super.viewDidLoad()

    trainingDetailsContainerView.addSubview(moduleLessonsTableView)
    moduleLessonsTableView.topAnchor.constraint(equalTo: trainingDetailsContainerView.topAnchor).isActive = true
    moduleLessonsTableView.leadingAnchor.constraint(equalTo: trainingDetailsContainerView.leadingAnchor).isActive = true
    moduleLessonsTableView.trailingAnchor.constraint(equalTo: trainingDetailsContainerView.trailingAnchor).isActive = true
    moduleLessonsTableView.bottomAnchor.constraint(equalTo: trainingDetailsContainerView.bottomAnchor).isActive = true

【讨论】:

嘿,谢谢!我不确定如何,但这产生了巨大的变化。还将其设置为 active = true。谢谢@Gienadij Mackiewicz 欢迎您,很高兴它有帮助 :) 是的,忘记将 isActive 设置为 true。已编辑答案以包含缺少的约束激活部分。【参考方案2】:

我已经检查过 - 这个 ViewController 应该可以工作:

class ViewController: UIViewController 

    @IBOutlet weak var trainingDetailsContainerView: UIView!

    var moduleLessonsTableView: UITableView = 
        let tableView = UITableView()
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.backgroundColor = Themes.gray_dec
        tableView.sectionHeaderHeight = 35
        tableView.rowHeight = 50
        tableView.isScrollEnabled = true
        tableView.register(TrainingModulesTableViewCell.self, forCellReuseIdentifier: "ModuleLessonsCell")

        return tableView
    ()

    override func viewDidLoad() 
        super.viewDidLoad()

        trainingDetailsContainerView.addSubview(moduleLessonsTableView)
        moduleLessonsTableView.topAnchor.constraint(equalTo: trainingDetailsContainerView.topAnchor).isActive = true
        moduleLessonsTableView.leadingAnchor.constraint(equalTo: trainingDetailsContainerView.leadingAnchor).isActive = true
        moduleLessonsTableView.trailingAnchor.constraint(equalTo: trainingDetailsContainerView.trailingAnchor).isActive = true
        moduleLessonsTableView.bottomAnchor.constraint(equalTo: trainingDetailsContainerView.bottomAnchor).isActive = true
    

【讨论】:

这是我做的,谢谢。我还删除了在初始化程序中设置行和节标题的高度,因为有一个代表(?)。 @Vadim Nikolaev

以上是关于tableView 在 UIView 内无法正确滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 tableview 滚动和再次拖动 tableview 上动画 UIView 位置

Swift 中带有 CollectionView 和 TableView 的 UIView

如何在tableview上方隐藏自定义视图

无法将 UIView 定位到 TableView 的底部

iOS UIView 大小

在 Swift 中单击 NSObject 内部的 tableView 中的项目时,如何在 NSObject 类中的 UIViewController 上的 UIView 之间正确切换?