Значок отображается за UIButton

Я создал собственный класс, который добавляет значок в UIButton. Сам значок является UIImageView. Кнопка может иметь различный пользовательский интерфейс для каждого состояния; когда кнопка отключена, она имеет четкий фон, показывает рамку и заголовок, как показано на рисунке ниже.

введите описание изображения здесь

Как вы можете видеть, значок отображается за границей, но я хочу, чтобы значок был поверх него. Я попытался отрегулировать zPosition слоя значка, установив его, например, на 9999. Я также попытался вывести значок на передний план, используя метод yieldSubviewToFront. Оба способа не сработали. Мой код для добавления значка на кнопку таков:

private func addBadgeImageToButton() {
    // badgeImage is a string containing the imageName
    guard badgeImage != nil else {
        return
    }

    badgeImageView = UIImageView(image: UIImage(named: badgeImage!))

    // This line merely adjusts the position of the UIImageView
    badgeImageView!.frame = adjustedRectangleForBadge(initialSize: badgeImageView!.frame.size)

    badgeImageView!.layer.zPosition = 9999
    addSubview(badgeImageView!)

    // This line does not seem to work
    //self.bringSubviewToFront(badgeImageView!)

    // Adding these two lines won't do the trick either
    self.setNeedsLayout()
    self.layoutIfNeeded()
}

Может ли кто-нибудь помочь мне с этой крошечной проблемой? Любая помощь очень ценится!

2 ответа

Решение

Это ожидаемое поведение. Граница должна всегда быть сверху всех подпредставлений. Вы можете получить желаемый эффект, добавив вместо UIView с границей на UIButton а затем добавив значок после него.

let borderView = UIView(frame: CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height)
borderView.layer.cornerRadius = self.layer.cornerRadius
borderView.layer.borderColor = self.layer.borderColor

// Remove the border color from the button its self
self.layer.borderColor = UIColor.clear.cgColor

// Add the border view to fake the border being there
addSubview(borderView)

// Then add the imageView on top of that border view
addSubview(badgeImageView)

Попробуйте поместить изображение значка после (под) кнопки в вашем XML.

Другие вопросы по тегам