Swift:动态更改 TableViewCell 高度和动态更改 WebView 高度

Posted

技术标签:

【中文标题】Swift:动态更改 TableViewCell 高度和动态更改 WebView 高度【英文标题】:Swift: Change TableViewCell Height Dynamically and change WebView Height Dynamically 【发布时间】:2016-08-23 12:07:24 【问题描述】:

我有一个TableViewController,在TableViewCell 里面,我有一个UIWebView。我希望UIWebView 显示来自互联网的一些内容,但我不想要滚动效果,我希望WebView 具有基于内容长度的动态高度。此外,我希望TableViewCell 能够根据WebView 的动态高度动态调整其单元格高度。这可能吗?

这就是我实现 TableViewController 的方式:

class DetailTableViewController: UITableViewController 

var passPost: Posts = Posts()
var author: Author = Author()

override func viewDidLoad() 
    super.viewDidLoad()

    getAuthor()


override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 1


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCellWithIdentifier("detailCell")

let postImageUrlString = passPost.postThumbnailUrlString
        let postImageUrl = NSURL(string: postImageUrlString)
        let size = CGSize(width: 414.0, height:212.0 )
        let filter = AspectScaledToFillSizeFilter(size: size)
        (cell?.contentView.viewWithTag(1) as! UIImageView).af_setImageWithURL(postImageUrl!, filter: filter)

        //Set Author Avatar

        let authorAvatarUrlString = author.authorAvatarUrlString
        let authorAvatarUrl = NSURL(string: authorAvatarUrlString)

        //Mark - Give Author Avatar a Round Corner

        let filter2 = AspectScaledToFillSizeWithRoundedCornersFilter(size: (cell?.contentView.viewWithTag(2) as! UIImageView).frame.size, radius: 20.0)

        (cell?.contentView.viewWithTag(2) as! UIImageView).af_setImageWithURL(authorAvatarUrl!, filter: filter2)


        //Set Post Title and Content and so on

        (cell?.contentView.viewWithTag(4) as! UILabel).text = passPost.postTitle
        (cell?.contentView.viewWithTag(6) as! UIWebView).loadhtmlString("\(passPost.postContent)", baseURL: nil)

对于heightForCellAtIndexPath我做了

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! tableViewCell
    tableView.rowHeight = cell.theWebView.scrollView.contentSize.height
    return tableView.rowHeight

这工作正常,除了WebView 具有滚动效果,并且由于TableViewCell 的限制而限制了高度。那么,如何实现我所需要的呢?

【问题讨论】:

您是否尝试将yourWebView.scrollView.isScrollEnabled 设置为false 是的,我试过了,通过这样做,WebView 无法滚动,但是它无法显示所有内容,因为TableViewCell 高度不是动态的。 你能发布你的 heightForRowAtIndexPath 委托方法实现吗? 我没有设置heightForRowAtIndexPath,所以我不知道如何实现,如果你有任何想法,谢谢。 【参考方案1】:

您需要在UITableViewDelegate 方法中设置单元格的高度 tableView(_:heightForRowAt:)

您将在此方法中对每个单独的单元格高度进行所有计算并将其返回。如果您想在不需要滚动的情况下完整地显示UIWebView,您应该返回 UIWebView 的滚动视图 contentView 的高度——加上您可能希望在此单元格中显示的任何其他内容的高度。

【讨论】:

所以你的意思是,例如,如果在TableViewCell 内我只想显示WebView 的全部内容,我需要在函数heightForRowAtIndexPath 内设置高度,就像这样tableView.rowHeight = theWebView.scrollView.contentSize.height 对吗?谢谢 那种。你会实现这个方法,做你的高度计算和return heightForThisCellIJustCalculated heightForThisCellJustCalculated 是默认值还是我计算的值?抱歉,我是 swift 新手 这是您要计算的值。 但内容是动态的,我无法计算。我刚刚使用了这条线tableView.rowHeight = cell.theWebView.scrollView.contentSize.height,但是swift给我一个错误missing return in a function expected to return 'CGFloat',我还应该返回什么?【参考方案2】:

按照以下步骤操作:

1) 设置从 webview 到 tableviewCell 的前导、尾随、顶部、底部约束 0(零)

2) 现在不需要调用 tableView 的 HeightForRow 方法了。

3) 在 webview 委托方法中

   func webViewDidFinishLoad(webView: UIWebView) 
       

        var frame = cell.webView.frame
        frame.size.height = 1
        let fittingSize = cell.webView.sizeThatFits(CGSizeZero)
        frame.size = fittingSize

        

4) webview scrollenabled = false

【讨论】:

我把第 3 步和第 4 步放在了func cellForRowAthIndexPath 里面,对吗? 它只是不工作。我没有设置单元格的高度,并像你说的那样设置约束。 webView.scrollenable 是假的。所以现在 WebView 不能滚动,但它没有显示所有的内容。 好的。得到它。现在您必须在 webViewDidFinish 方法中定义该单元格,并且您必须在设置 FittingSize 后重新加载该单元格并调用返回 FittingSize 的 HEightForRow 方法。明白了吗? 抱歉,我是 swift 新手,您介意再次编辑您的答案吗?非常感谢。 它的过程相当漫长。我建议你的步骤:调用 webviewDelegate 这样你就可以知道 webview 的高度,现在你必须根据 webview 的高度来设置单元格的高度。【参考方案3】:

你可以返回,在 heightForRowAtIndexPath:

tableView.rowHeight = UITableViewAutomaticDimension

你还需要在estimatedRowHeight中设置一个值,比如

tableView.estimatedRowHeight = 85.0

如果您在情节提要中正确定义了所有约束(或以编程方式),则不会出现任何错误。

参考:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithSelf-SizingTableViewCells.html

【讨论】:

我之前试过这个,它给了我错误Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

以上是关于Swift:动态更改 TableViewCell 高度和动态更改 WebView 高度的主要内容,如果未能解决你的问题,请参考以下文章

使用动态tableView的tableViewCell中的动态collectionViewCell执行Segue With Identifier,swift

Swift - tableviewcell 中的动态按钮数

动态 CollectionView 依赖于 SWIFT 4.0 中的 TableViewCell 值

IOS Swift 5 为动态高度 TableView 单元添加自定义 TableViewCell 分隔符

Swift - TableViewCell 中不同大小的图像的困难

在自定义 TableViewCell 中动态更改 UILabel 框架