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) 上移动标题和选项卡

为表头和制表符的顶部位置设置两个约束和出口,并将约束的常量值更改为对应scrollViews位置

解决方案 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 Async 函数在 Swift 中完成

尝试从查询中将 Parse PFFiles 加载到 UITableView

使用Swift中的Parse删除表视图单元格

私人聊天应用程序 - Parse 和 Swift

使用swift在UITableView中添加UIButton(跟随按钮)

UITableView 中的单元格在 iOS 中选择之前不会更新(swift)