Я много читал о прокручивании TableView, и общий ответ состоял в том, что мне нужно использовать prepareForReuse, чтобы снова стилизовать элемент и сбросить изображения.
Моя проблема все еще существует. Если я прокручиваю достаточно быстро, мое предварительное изображение в ячейке не является кругом, вместо этого оно имеет округленную границу 5 пикселей, хотя условие никогда не выполнялось.
Где здесь маги c, которые у меня всегда есть желаемый условный результат? postType == 0 = фотография (которая должна быть круглой), postType == 2 = текст, который должен иметь закругленные углы.
MainView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableViewNew.dequeueReusableCell(withIdentifier: "cellNewPosts", for: indexPath) as! MainNewTableViewCell
cell.post = posts[indexPath.row]
return cell
}
Моя пользовательская ячейка
import UIKit
import AVKit
import SDWebImage
class MainNewTableViewCell: UITableViewCell {
// Storyboard
@IBOutlet weak var viewContainer: ShadowedView! {
didSet {
viewContainer.layer.cornerRadius = 10
viewContainer.backgroundColor = .white
viewContainer.shadowColor = colorGrey
viewContainer.shadowRadius = 1
}
}
@IBOutlet weak var imageViewPreview: UIImageView! {
didSet {
imageViewPreview.backgroundColor = .white
imageViewPreview.layer.cornerRadius = imageViewPreview.frame.height / 2
}
}
@IBOutlet weak var viewContainerPreview: UIView! {
didSet {
viewContainerPreview.backgroundColor = .white
viewContainerPreview.layer.cornerRadius = viewContainerPreview.frame.height / 2
viewContainerPreview.layer.borderWidth = 2
viewContainerPreview.layer.borderColor = colorLightGrey.cgColor
}
}
@IBOutlet weak var labelPostFromCity: UILabel! {
didSet {
labelPostFromCity.layer.shadowColor = colorLightGrey.cgColor
labelPostFromCity.layer.shadowRadius = 1
labelPostFromCity.layer.shadowOpacity = 1
labelPostFromCity.layer.shadowOffset = CGSize(width: 1, height: 1)
labelPostFromCity.layer.masksToBounds = false
}
}
@IBOutlet weak var labelPostFromCountry: UILabel!
@IBOutlet weak var labelPostDate: UILabel!
@IBOutlet weak var imageTextBubble: UIImageView! {
didSet {
imageTextBubble.tintColor = colorDarkPastelBlue
}
}
@IBOutlet weak var imageHeart: UIImageView!
@IBOutlet weak var labelAmountLikes: UILabel!
@IBOutlet weak var labelAmountComments: UILabel!
// Variables
// AVPlayer Looper
var playerLooper: NSObject?
var playerLayer: AVPlayerLayer!
var queuePlayer: AVQueuePlayer?
var player: AVPlayer?
var mediaToUpload: Data?
var movieString: String?
var movieUrl: URL?
var post: PostModel? {
didSet {
guard let _postFromCity = post?.postFromCity else { return }
guard let _postFromCountry = post?.postFromCountry else { return }
guard let _postDate = post?.postDate else { return }
guard let _postMediaUrl = post?.postMediaUrl else { return }
guard let _postType = post?.postType else { return }
guard let _postText = post?.postText else { return }
setupViewCell(postFromCity: _postFromCity, postFromCountry: _postFromCountry, postDate: _postDate, postMediaUrl: _postMediaUrl, postType: _postType, postText: _postText)
}
}
func setupViewCell(postFromCity: String, postFromCountry: String, postDate: Double, postMediaUrl: String, postType: Int, postText: String) {
imageViewPreview.image = nil
labelPostFromCity.text = postFromCity
labelPostFromCountry.text = postFromCountry
let postDate = postDate
let formattedPostDate = Date(timeIntervalSince1970: postDate)
let timeAgo = formattedPostDate.timeAgo(numericDates: false)
labelPostDate.text = timeAgo
if postType == 0 {
imageViewPreview.layer.cornerRadius = imageViewPreview.frame.height / 2
viewContainerPreview.layer.cornerRadius = viewContainerPreview.frame.height / 2
let mappedUrl = URL(string: postMediaUrl)
imageViewPreview.sd_imageIndicator = SDWebImageActivityIndicator.white
imageViewPreview.sd_setImage(with: mappedUrl) {(_, _, _, _) in }
}
if postType == 1 {
}
if postType == 2 {
imageViewPreview.layer.cornerRadius = 0
viewContainerPreview.layer.cornerRadius = 10
let xxx = UIColor.clear.image(CGSize(width: 50, height: 50))
let xxxx = textToImage(drawText: postText, inImage: xxx, atPoint: CGPoint(x: 0, y: 0))
imageViewPreview.image = xxxx
}
}
// Add text to the fake preview image
func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
let textColor = UIColor.black
let textFont = UIFont(name: "Helvetica Bold", size: ?!
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(image.size, false, scale)
let textFontAttributes = [
NSAttributedString.Key.font: textFont,
NSAttributedString.Key.foregroundColor: textColor,
] as [NSAttributedString.Key : Any]
image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
let rect = CGRect(origin: point, size: image.size)
text.draw(in: rect, withAttributes: textFontAttributes)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
override func awakeFromNib() {
super.awakeFromNib()
self.selectionStyle = .none
}
override func prepareForReuse() {
imageViewPreview.layer.cornerRadius = imageViewPreview.frame.height / 2
viewContainerPreview.layer.cornerRadius = viewContainerPreview.frame.height / 2
super.prepareForReuse()
}
}
extension UIColor {
func circleImage(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage {
return UIGraphicsImageRenderer(size: size).image(actions: { rendererContext in
self.setFill()
rendererContext.cgContext.fillEllipse(in: CGRect(origin: .zero, size: size))
})
}
}