Реализация любимой кнопки в iOS - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь реализовать любимую кнопку в приложении, и это моя попытка. Вот что у меня сейчас есть:

let favoriteButton: UIButton = {
    let button = UIButton(type: .custom)
    var emptyHeartImg = UIImage(named: "emptyheart")
    var fullHeartImg = UIImage(named: "fullheart")
    emptyHeartImg = emptyHeartImg?.maskWithColor(color: UIColor(r: 128, g: 171, b: 103))
    fullHeartImg = fullHeartImg?.maskWithColor(color: UIColor(r: 128, g: 171, b: 103))
    let imageView = UIImageView(image: emptyHeartImg, highlightedImage: fullHeartImg)
    imageView.contentMode = .scaleAspectFill
    button.setImage(imageView.image, for: .normal)
    button.addTarget(self, action: #selector(handleFavorite), for: .touchUpInside)
    return button
}()

@objc private func handleFavorite() {
    if (favoriteButton.imageView?.isHighlighted)! == false {
        favoriteButton.imageView?.isHighlighted = true
    } else {
        favoriteButton.imageView?.isHighlighted = false
    }
}

В настоящее время это не меняет изображение по желанию. Какие-нибудь советы или альтернативные способы реализации любимой кнопки?

1 Ответ

0 голосов
/ 04 ноября 2018

Я бы использовал UIButton.isSelected вместо состояния подсветки imageView. Я не уверен насчет UIImageView, но isHighlighted для кнопок только при их активном прикосновении, а не в постоянном состоянии. Смотрите строки, помеченные **:

let favoriteButton: UIButton = {
    let button = UIButton(type: .custom)
    var emptyHeartImg = UIImage(named: "emptyheart")
    var fullHeartImg = UIImage(named: "fullheart")
    emptyHeartImg = emptyHeartImg?.maskWithColor(color: UIColor(r: 128, g: 171, b: 103))
    fullHeartImg = fullHeartImg?.maskWithColor(color: UIColor(r: 128, g: 171, b: 103))
    **button.setImage(emptyHeartImg, for: .normal)
    **button.setImage(fullHeartImg, for: .selected)
    **button.imageView?.contentMode = .scaleAspectFill
    button.addTarget(self, action: #selector(handleFavorite), for: .touchUpInside)
    return button
}()

А потом в вашем обработчике:

favoriteButton.isSelected = !favoriteButton.isSelected
...