Как правильно назначить стиль на основе условия для ячейки, не получая странное поведение стиля после быстрой прокрутки? - PullRequest
0 голосов
/ 22 апреля 2020

Я много читал о прокручивании 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))
        })
    }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Надеюсь, это поможет Добавить условие в layoutSubview() в классе ячеек

 func layoutSubview() {
   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 }
} else 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
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...