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
动态 CollectionView 依赖于 SWIFT 4.0 中的 TableViewCell 值
IOS Swift 5 为动态高度 TableView 单元添加自定义 TableViewCell 分隔符