ios - 如果 UIImage 设置为 .scaleAspectFill,它会与标签重叠

标签 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应用程序本身的一些打印件显示图像重叠在标签上。

它仅在图像处于纵向模式时重叠,如果图像是在横向模式下拍摄的,则它很适合。

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

最佳答案

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

通过使用 .clipToBounds = true 来做到这一点。

cell.postImageView.clipToBounds = true

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

Enable Clip To Bounds

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

关于ios - 如果 UIImage 设置为 .scaleAspectFill,它会与标签重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41042867/

相关文章:

ios - 致命异常 : NSInternalInconsistencyException this request has been neutered - you can't call -sendResponse: twice nor after encoding it

ios - Swift 函数变量需要弱引用吗?

swift - UITableView 变量

ios - AudioOutputUnitStart() 和 RemoteIO 的渲染回调之间的时间差异

ios - 从 Xcode 项目运行应用程序时 Cocoapods 链接器错误

iOS开发-无限层级的uitableview

iphone - TableView 中重复使用的单元格中的图像未从 ImageVIew 中清除

Ios Swift 添加带有过渡/效果的 UIImageView

ios - UIPinchGestureRecognizer 变换未从中心调整大小

ios - 如何截取单个 View 对象而不是整个屏幕的屏幕截图?