Создание кнопки типа hapti c в Swift / Obj- C - PullRequest
1 голос
/ 23 апреля 2020

Я поигрался с идеей для кнопки, которая, когда удерживается, расширяется, чтобы показать другие кнопки (например, FAB в Android). Не отпуская, проведите пальцем вниз, чтобы выделить другие кнопки, похожие на поведение hapti c touch.

Вот грубый макет, который я создал с помощью Drama: https://youtu.be/Iam8Gjv3gqM.

Также должна быть возможность иметь метку горизонтально рядом с каждой кнопкой, и порядок кнопок должен быть таким, как показано (с выбранной кнопкой сверху вместо ее обычного положения).

У меня уже есть класс для каждой кнопки (см. Ниже), но я не знаю, как добиться этого макета / поведения.

class iDUButton: UIButton {
    init(image: UIImage? = nil) {
        super.init(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
        if let image = image {
            setImage(image, for: .normal)
        }
        backgroundColor = .secondarySystemFill
        layer.cornerRadius = 15
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

class iDUBadgeButton: iDUButton {
    var badgeLabel = UILabel()
    var badgeCount = 0

    override init(image: UIImage? = nil) {
        super.init(image: image)
        setup()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setup()
    }

    private func setup() {
        badgeLabel.textColor = .white
        badgeLabel.backgroundColor = .systemRed
        badgeLabel.textAlignment = .center
        badgeLabel.font = .preferredFont(forTextStyle: .caption1)
        badgeLabel.alpha = 0
        updateBadge()
        addSubview(badgeLabel)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        badgeLabel.sizeToFit()
        let height = max(18, badgeLabel.frame.height + 5.0)
        let width = max(height, badgeLabel.frame.width + 10.0)
        badgeLabel.frame = CGRect(x: frame.width - 5, y: -badgeLabel.frame.height / 2, width: width, height: height);
        badgeLabel.layer.cornerRadius = badgeLabel.frame.height / 2;
        badgeLabel.layer.masksToBounds = true;
    }

    func setBadgeCount(badgeCount: Int) {
        self.badgeCount = badgeCount;
        self.updateBadge()
    }

    func updateBadge() {
        if badgeCount != 0 {
            badgeLabel.text = "\(badgeCount)"
        }
        UIView.animate(withDuration: 0.25, animations: {
            self.badgeLabel.alpha = self.badgeCount == 0 ? 0 : 1
        })
        layoutSubviews()
    }
}

Если бы кто-нибудь мог помочь в достижении этого макета, я был бы очень благодарен! Заранее спасибо.

PS: Я разрабатываю пользовательский интерфейс в Swift, но по завершении буду преобразовывать его в Objective- C. Если вам интересно, используйте вариант для адаптации кнопки в верхнем левом углу this , чтобы предлагать выбор различных тегов.

...