如果标签设置为.scaleAspectFill,则UIImage会重叠标签

时间:2016-12-08 15:21:38

标签: ios uitableview uiimageview uiimage swift3

我的应用程序从后端加载图像并将其显示在UITableViewCell中,其中包含UIImageView以显示它以及一些标签和按钮。

我已经向UITableViewCell添加了建议的约束,其中“重置为建议的约束”'选项。

这是检索数据后的一些代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var cell = PostTableViewCell()

    if (self.posts.count == 0) { return cell }

    let post = posts[indexPath.row]

    // Instancia o reuse identifier
    if post["post_image"] != nil {
        cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.PostWithImage, for: indexPath) as! PostTableViewCell
    } else {
        cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.PostWithoutImage, for: indexPath) as! PostTableViewCell
    }
    return cell
}


override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    var cell = PostTableViewCell()
    cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.PostWithImage) as! PostTableViewCell
    return cell.bounds.size.height;
}


override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    var cell = PostTableViewCell()
    cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.PostWithImage) as! PostTableViewCell
    return cell.bounds.size.height;
}

private func configureCell(cell: PostTableViewCell, atIndexPath indexPath: IndexPath) {

    cell.queue.cancelAllOperations()

    let operation: BlockOperation = BlockOperation()
    operation.addExecutionBlock { [weak operation] () -> Void in

        DispatchQueue.main.sync(execute: { [weak operation] () -> Void in
            if (operation?.isCancelled)! { return }

            let post = self.posts[indexPath.row]
            cell.accessibilityIdentifier = post.recordID.recordName

            guard let postTitle = post["post_title"], let postBody = post["post_body"] else {
                return
            }

            if let asset = post["post_image"] as? CKAsset {

                self.imageCache.queryDiskCache(forKey: post.recordID.recordName, done: { (image, cachetype) in
                    if image != nil {
                        cell.postImageView.contentMode = .scaleAspectFill
                        cell.postImageView.autoresizingMask = [.flexibleBottomMargin,
                                                               .flexibleHeight,
                                                               .flexibleLeftMargin,
                                                               .flexibleRightMargin,
                                                               .flexibleTopMargin,
                                                               .flexibleWidth ];
                        cell.postImageView.image = image!
                    } else {
                        do {
                            let data = try Data(contentsOf: asset.fileURL)
                            let image = UIImage(data: data)
                            cell.postImageView.contentMode = .scaleAspectFill
                            cell.postImageView.autoresizingMask = [.flexibleBottomMargin,
                                                                   .flexibleHeight,
                                                                   .flexibleLeftMargin,
                                                                   .flexibleRightMargin,
                                                                   .flexibleTopMargin,
                                                                   .flexibleWidth ];
                            cell.postImageView.image = image!
                            self.imageCache.store(image!, forKey: post.recordID.recordName)

                        } catch {
                            print("Error 1001 = \(error.localizedDescription)")
                        }
                    }
                })

            }

            cell.titleLabel.text = postTitle as? String
            cell.bodyLabel.text =  postBody as? String
        })
    }
    cell.queue.addOperation(operation)
}

Here's来自应用程序本身的一些打印件,显示图像在标签上重叠。

如果图像处于纵向模式,它只会重叠,如果图像是以横向拍摄的,则它非常适合。

绕过此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以通过编程方式告诉图像仅在给定图像区域中绘制。如果您的约束正常工作并且保持正确的大小,则由于.scaleAscpedtFill设置,图像可能只是超出View界限。

使用.clipToBounds = true。

执行此操作
Public Shared Function CreateLocalObject() As Object
    Dim localObj As New Object
    localObj = CreateObject("ADODB.Recordset")
    localObj.CursorLocation = ADORef.ADOVBS.adUseClient
    Return localObj
End Function

Public Shared Sub DeleteLocalObject(ByRef localObj As Object)
    If localObj.State() Then localObj.Close()
    localObj = Nothing
End Sub

或者,您也可以在界面构建器中根据下图进行设置。

Enable Clip To Bounds

尝试一下,看看是否有帮助?