Finb / V2ex-Swift

An iOS client written in Swift for V2EX

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

帖子详情帖子内容后面有一大段空白

kaich opened this issue · comments

我看了你的源码,自己试着用你的代码加载其他网页,发现有的时候帖子下面会有一大段的空白,应该是webview内容计算高度有问题?同样一个网页一下进去高度正常,一会进去又有一大段空白,这种情况大概会是什么问题啊?
ps. 为什么不加上发帖子功能呢?

commented

我还不太理解你描述的问题。
显示帖子的cell会自动适应网页的高度
具体实现如下,你可以参考下找找原因

首先 cell 内的 webView 是和cell本身一样大的,通过约束布局。
当cell 自身变大时,webView也会跟着一起调整大小

self.contentWebView!.snp_makeConstraints{ (make) -> Void in
     make.left.top.right.bottom.equalTo(self.contentView)
}

然后当webView 内容高度产生变化时,会调用 contentHeightChanged 闭包。通知viewController

self.KVOController.observe(self.contentWebView!.scrollView, keyPath: "contentSize", options: [.New]) {
    [weak self] (observe, observer, change) -> Void in
    if let weakSelf = self {
        let size = change![NSKeyValueChangeNewKey] as! NSValue
        weakSelf.contentHeight = size.CGSizeValue().height;
        weakSelf.contentHeightChanged?(weakSelf.contentHeight)
    }
}

然后在 viewController 里,当webView内容高度有变化时,则会刷新UITableView,更新cell的高度

self.webViewContentCell!.contentHeightChanged = { [weak self] (height:CGFloat) -> Void  in
    if let weakSelf = self {
        //在cell显示在屏幕时更新,否则会崩溃会崩溃会崩溃
        if weakSelf.tableView.visibleCells.contains(weakSelf.webViewContentCell!) {
            if weakSelf.webViewContentCell?.contentHeight > 1.5 * SCREEN_HEIGHT{ //太长了就别动画了。。
                UIView.animateWithDuration(0, animations: { () -> Void in
                    self?.tableView.beginUpdates()
                    self?.tableView.endUpdates()
                })
            }
            else {
                self?.tableView.beginUpdates()
                self?.tableView.endUpdates()
            }
        }
    }
}

当cell的高度改变时,由于webView和cell之间的约束,webView也会跟着一起调整大小。

最后 cell、webView控件和 webView内容的高度,都将一致。

这里基本能实现我的需求
但如果你是加载远程站点,需要注意这里有个问题
我是监听 webView 的 scorllView 中的 contentSize 属性。来达到监听内容高度的功能。

但是这个属性并不是 内容高度。
当这个contentSize > 内容高度时,内容高度变化时, contentSize将不再变化
只有当内容高度 > contentSize 时,contentSize 将会调整到 适应内容高度

也就是说如果你的 contentSize的高度达到过1000 ,那么就算内容高度变得小于1000了 ,contentSize的高度都是1000
也就是可能会出现一大段空白

@Finb 非常感谢,受教了。应该是你说的 当这个contentSize > 内容高度时,内容高度变化时, contentSize将不再变化,如果是这样的话,那如何当帖子contentSize > 内容高度 ,内容高度变化时,监听到它的实际高度啊?

@Finb 我找到问题了,原因的确如你所说的那样,我本来想找找那如何当帖子contentSize > 内容高度 ,内容高度变化时,监听到它的实际高度啊?的方法,现在回头看看它的html中图片元素是这样的。

<img id="aimg_RBktT" onclick="zoom(this, this.src, 0, 0, 0)" class="zoom" width="401" file="http://images.weiphone.net/data/attachment/forum/201508/14/113556ulrrntnetxxjqnrc.png" border="0" alt="" src="http://images.weiphone.net/data/attachment/forum/201508/14/113556ulrrntnetxxjqnrc.png" lazyloaded="true" _load="1">

它把img的高度给写死了。这样虽然在ios中会适配,图片会变得比电脑上面的小,高度自然就少了。然后就造成了你说的那个问题,于是我在onload的时候中加了的javascript脚本,把img的width属性给删掉了。
img.removeAttribute('width')
这样之后所有的内容高度就正常了。
非常感谢你的帮助啊。看你代码风格和swift使用都挺不错的。大牛👍!

有什么办法可以直接拿到 Contentsize 最后的值吗? 或者说有什么方法可以知道他的 Contentsize 什么时候计算完吗?

commented

@yurnery webViewDidFinishLoad 代理方法可以, 网页加载完成之后,肯定是最后的Contentsize。
其实这里要非常注意,我这里的代码和方法仅仅是针对V2EX的帖子内容写的,因为V2EX帖子内容较少较简单。如果要用这种方法显示其他页面不一定合适。如果页面过长有可能会内存爆掉程序直接崩了,或者有上面我回复kaich时说的高度问题