Как нарисовать значок и добавить его к изображению в iOS Swift

У меня есть значок уведомления, и я хочу показать этот значок со значком, пока доступны новые уведомления, иначе мне нужно показать только значок уведомления.

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

Пожалуйста, обратитесь к скриншоту 1, так как скриншот - это значок уведомления, который у меня есть.

Обратитесь к скриншоту 2 для ожидаемого, когда появится новое уведомление, я хочу нарисовать значок и добавить его к существующему значку.

заранее спасибо

UIKit или SwiftUI? Что вы пробовали? Circle для SwiftUI или простой UIView с радиусом угла для UIKit — хорошие отправные точки. Вам не нужно добавлять значок к изображению. Просто нарисуйте его поверх изображения.

Paulw11 11.02.2023 09:17

Привет @Paulw11, я жду в UIKit

Jayaseelan Kumarasamy 11.02.2023 09:51

Затем я предлагаю вам создать UIView, установить его цвет на красный, ограничить его ширину и высоту и установить его угловой радиус равным половине ширины/высоты. Затем поместите это представление в верхний угол вашего UIImageView.

Paulw11 11.02.2023 10:04

Используйте символ научной фантастики с именем bell.badge. Он поддерживает многоцветность, поэтому вы сможете сделать точку красной.

HangarRash 11.02.2023 10:13

Привет @HangarRash, значок колокольчика SF Symbol немного отличается, поэтому я не могу его использовать, спасибо !!!

Jayaseelan Kumarasamy 11.02.2023 10:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AlertWithBadgeView — это представление с двумя изображениями. alertImageView используется для фонового изображения, а badgeImageView используется для изображения значка.

class AlertWithBadgeView: UIView {
    
    var alertImageView: UIImageView!
    var badgeImageView: UIImageView!
    
    required init?(coder: NSCoder) {
        fatalError("don't use the view from within storyboards or xibs")
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        createView()
    }
    
    private func createView() {
        _ = {
            let imageView = UIImageView()
            addSubview(imageView)
            imageView.frame = bounds
            imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            alertImageView = imageView
        }()
        _ = {
            let imageView = UIImageView()
            addSubview(imageView)
            imageView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                imageView.widthAnchor.constraint(equalToConstant: 20),
                imageView.heightAnchor.constraint(equalToConstant: 20),
                imageView.topAnchor.constraint(equalTo: topAnchor),
                imageView.trailingAnchor.constraint(equalTo: trailingAnchor),
            ])
            badgeImageView = imageView
        }()
    }
}

Базовое создание и настройку можно выполнить с помощью метода cellForRow(at:):

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
    
    let alert = AlertWithBadgeView()
    alert.alertImageView.image = .init(systemName: "bell.badge")
    alert.badgeImageView.image = .init(systemName: "circle.fill")
    cell.addSubview(alert)
    alert.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        cell.centerYAnchor.constraint(equalTo: alert.centerYAnchor),
        cell.leadingAnchor.constraint(equalTo: alert.leadingAnchor, constant: -20),
        alert.widthAnchor.constraint(equalToConstant: 30),
        alert.heightAnchor.constraint(equalToConstant: 30),
    ])
    return cell
}

Приведенное выше решение прекрасно, но в моем случае оно отличается, у нас есть пользовательские компоненты, которые мы разработали как другую структуру, мы потребляем необходимые компоненты пользовательского интерфейса, здесь компонент принимает только изображение, мы не можем использовать его как представление изображения и все такое, поэтому можно добавить значок к существующему значку изображения и передать его этой переменной компонента в качестве изображения, в новом сценарии уведомлений мне нужно передать значок изображения со значком

Jayaseelan Kumarasamy 11.02.2023 14:33

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