Swift Parse - UITableViewAutomaticDimension 从解析下载图像时它们的大小不正确,直到我滚动
Posted
技术标签:
【中文标题】Swift Parse - UITableViewAutomaticDimension 从解析下载图像时它们的大小不正确,直到我滚动【英文标题】:Swift Parse - UITableViewAutomaticDimension when downloading images from parse they are the incorrect size until I scroll 【发布时间】:2016-01-20 20:27:33 【问题描述】:我添加了一个表格视图,并在单元格中显示图像。我还添加了这段代码:
以便单元格根据图像调整大小。
当我启动我的应用程序时,我得到了这个:
[]
直到我开始滚动图像才会加载...如果我向下滚动页面的一半然后返回顶部,我会得到:这是正确的
有什么想法吗?我在 google 上进行了研究,并为旧版本的 Xcode 尝试了奇怪的解决方案,但似乎没有任何效果!
这是我在 TableViewController 中的其余代码:
extension TimelineViewController: UITableViewDataSource
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 46
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return timelineComponent.content.count
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
let headerCell = tableView.dequeueReusableCellWithIdentifier("PostHeader") as! PostHeaderTableViewCell
let post = self.timelineComponent.content[section]
headerCell.post = post
return headerCell
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 1
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as! PostTableViewCell
//cell.postImageView?.image = UIImage(named: "Background.png")
let post = timelineComponent.content[indexPath.section]
post.downloadImage()
post.fetchLikes()
cell.post = post
cell.layoutIfNeeded()
return cell
extension TimelineViewController: UITableViewDelegate
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
timelineComponent.targetWillDisplayEntry(indexPath.section)
下载图片代码:
func downloadImage()
// 1
image.value = Post.imageCache[self.imageFile!.name]
if image is not downloaded yet, get it
if (image.value == nil)
imageFile?.getDataInBackgroundWithBlock (data: NSData?, error: NSError?) -> Void in
if let data = data
let image = UIImage(data: data, scale: 2.0)!
self.image.value = image
// 2
Post.imageCache[self.imageFile!.name] = image
// MARK: PFSubclassing
extension Post: PFSubclassing
static func parseClassName() -> String
return "Post"
override class func initialize()
var onceToken : dispatch_once_t = 0;
dispatch_once(&onceToken)
// inform Parse about this subclass
self.registerSubclass()
// 1
Post.imageCache = NSCacheSwift<String, UIImage>()
这是我的 TableViewCell:
var post: Post?
didSet
postDisposable?.dispose()
likeDisposable?.dispose()
if let oldValue = oldValue where oldValue != post
oldValue.image.value = nil
if let post = post
postDisposable = post.image
.bindTo(postImageView.bnd_image)
likeDisposable = post.likes
.observe (value: [PFUser]?) -> () in
if let value = value
//self.likesLabel.text = self.stringFromUserList(value)
self.likeButton.selected = value.contains(PFUser.currentUser()!)
// self.likesIconImageView.hidden = (value.count == 0)
else
//self.likesLabel.text = ""
self.likeButton.selected = false
//self.likesIconImageView.hidden = true
非常感谢任何帮助!
【问题讨论】:
您必须将所有三个视图放入一个大的滚动视图中:) @Breek 嗯,我尝试使用 UIScrollView 但它似乎不起作用..更有可能是我的错!您介意在答案中给我一个小例子或下面的东西吗?!无论如何,谢谢! 你昨天几乎问了the same question,然后在 3 小时前删除了它。当您可能再次删除它时,为什么有人会费心回答这个问题? @Caleb 是的,你回答了。你忽略了我的评论,这不是很有帮助。 【参考方案1】:解决方案 1
将标题和选项卡作为子视图添加到内容视图。这样你就可以免费获得卷轴了。
scrollView.contentView.addSubView(headerView)
scrollView.contentView.addSubView(tabView)
scrollView.contentView.addSubView(contentView)
let headerHight = 200
let tabHeight = 200
headerView.frame = CGRect(0, 0, UIScreen.mainScreen().bounds.width, headerHight)
tabView.frame = CGRect(0, headerHight, UIScreen.mainScreen().bounds.width, tabHeight)
contentView.frame = CGRect(0, headerHight + tabHeight, UIScreen.mainScreen().bounds.width, contentHeight)
解决方案 2
实现 UIScrollViewDelegate
并在 func scrollViewDidScroll(scrollView: UIScrollView)
上移动标题和选项卡
为表头和制表符的顶部位置设置两个约束和出口,并将约束的常量值更改为对应scrollView
s位置
解决方案 3
在tableView
中实现所有内容并将标头设置为tableView.tableHeaderView
。如果标签栏应该跟随标题的滚动,最好将标签栏也包含在标题中。
【讨论】:
【参考方案2】:好的,代码示例就来了(很丑的UI)
override func viewDidLoad()
super.viewDidLoad()
let screenWidth = view.frame.width
let screenHeight = view.frame.height
let subViewHeight = screenHeight / 3
let mainView = UIScrollView(frame: view.frame)
mainView.backgroundColor = UIColor.lightTextColor()
mainView.contentSize = CGSize(width: screenWidth, height: screenHeight + 100)
view = mainView
let firstView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: subViewHeight))
firstView.backgroundColor = UIColor.redColor()
let secondView = UIView(frame: CGRect(x: 0, y: subViewHeight, width: screenWidth, height: subViewHeight))
secondView.backgroundColor = UIColor.blueColor()
let thirdView = UIScrollView(frame: CGRect(x: 0, y: subViewHeight * 2, width: screenWidth, height: subViewHeight + 100))
thirdView.contentSize = CGSize(width: screenWidth, height: screenHeight)
thirdView.backgroundColor = UIColor.greenColor()
view.addSubview(firstView)
view.addSubview(secondView)
view.addSubview(thirdView)
【讨论】:
以上是关于Swift Parse - UITableViewAutomaticDimension 从解析下载图像时它们的大小不正确,直到我滚动的主要内容,如果未能解决你的问题,请参考以下文章
尝试从查询中将 Parse PFFiles 加载到 UITableView