Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Swift : uikit, view

Как реализовать вьюху в форме бублика, чтобы касание срабатывало только на само кольцо, а не на центр?

Вопрос проверяет знание кастомизации обработки касаний через переопределение метода point(inside:with:) для создания нетривиальной области отклика.

Короткий ответ

Нужно создать подкласс UIView и переопределить метод point(inside:with:). Внутри этого метода следует проверить, попадает ли точка касания в кольцо (бублик). Это можно сделать, проверив, что точка находится внутри большого круга, но за пределами внутреннего малого круга. Метод должен вернуть true только если условие выполняется.

Длинный ответ

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

Пример реализации для кольца (бублика):

class DonutView: UIView {
    /// Ширина кольца бублика
    var ringWidth: CGFloat = 20.0

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        // 1. Находим центр вьюхи
        let center = CGPoint(x: bounds.midX, y: bounds.midY)

        // 2. Вычисляем расстояние от центра до точки касания
        let distance = hypot(point.x - center.x, point.y - center.y)

        // 3. Вычисляем радиусы внешнего и внутреннего кругов
        let outerRadius = min(bounds.width, bounds.height) / 2.0
        let innerRadius = outerRadius - ringWidth

        // 4. Проверяем, что точка находится в кольце: дальше внутреннего радиуса, но ближе внешнего.
        return distance <= outerRadius && distance >= innerRadius
    }
}

Как это работает:

  • Система вызывает point(inside:with:) для определения, было ли касание в пределах вьюхи.

  • Метод возвращает true, если точка находится в рассчитанной области кольца, и false для центральной части и области за пределами вьюхи.

  • Это не меняет внешний вид вьюхи, только ее "сенсорную" область.

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    1

  • Сложность:

    7

Навыки

  • Swift

    Swift

Ключевые слова

#uikit

#view

Подпишись на iOS Developer в телеграм

  • Аватар

    iOS Guru

    Roman Isakov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.