Круглое меню - создавать меню и вызывать действие, только если нажата область, а не просто значок - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать круговое меню, как показано ниже для приложения iPhone.

enter image description here

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

enter image description here

Действие пользователя будет вызвано только в том случае, если я щелкну в любом месте пользователя пользователя, как показано на изображении выше.

Есть идеи, как этого добиться?

У меня есть одна идея - проверитьx & y положение крана и определение места его нажатия (но это очень дорого)

ИЛИ

Есть ли способ создать кнопки этих форм?

1 Ответ

0 голосов
/ 05 июня 2018

У меня есть одна идея - проверить положение x & y крана и выяснить, где он щелкнул (но это очень дорого)

На самом деле это очень хорошая идея, ирасчеты совсем не дорогостоящие.

// Function to compute button touched
//
// Returns:
// 0 - 7:  One of the 8 outer buttons touched
// 8:      Center button touched
// 9:      Touch outside of outer circle (no button touched)

func detectTouchedButton(_ touchPoint: CGPoint) -> Int {

    // Set these values for your situation:
    let innerRadius: CGFloat = 50
    let outerRadius: CGFloat = 150
    let center = CGPoint(x: 150, y: 200)

    // Compute horizontal and vertical distance of touch from center
    let dx = touchPoint.x - center.x
    let dy = center.y - touchPoint.y

    // was the center button touched?
    let distanceSquared = dx * dx + dy * dy
    if distanceSquared < innerRadius * innerRadius {
        return 8
    }

    // was touch outside of outer circle?
    if distanceSquared > outerRadius * outerRadius {
        return 9
    }

    // Use atan2 to get an angle between -.pi and
    // .pi.  Divide by .pi to get number in the range
    // of (-1...1).  Add 1 to get a range of (0...2).
    // Multiply by 4 to get a range of (0...8).  Mod
    // by 8 since 0 == 8 (same button)  
    return Int(4 * (atan2(dy, dx) / .pi + 1)) % 8
}

Примечания:

  • Я перевернул расчет dy, потому что система координатСверху вниз.Это просто возвращает систему координат в +y в математическом смысле и изменяет окончательный порядок от 0 до 7.

  • Если вы хотите, вы можете изменить это навернуть Int?, а затем вернуть nil для касаний, которых нет на кнопке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...