Круглая кнопка на iOS - PullRequest
4 голосов
/ 26 марта 2012

Можно ли создать две кнопки, показанные на рисунке ниже?Может показаться, что вам следует использовать UIButton или UIImageView, но если я щелкаю область 1, она все равно действует как нажатие кнопки 1. Кнопка 2 также должна срабатывать, когда я нажимаю область 1!

enter image description here

Ответы [ 7 ]

7 голосов
/ 07 декабря 2012

Если вышеприведенные ответы не являются приемлемыми, вы можете реализовать пользовательский подкласс UIButton, который переопределяет pointInside:withEvent:.

Предполагая, что ваше представление точно квадратное, а изображение ровно круглое изаполняя весь квадрат, пример может быть:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // check that the point is at least inside the normal rect
    if(![super pointInside:point withEvent:event]) return NO;

    // we'll assume a square view with an exact circle inside, so
    // the radius of the circle is just half the width
    CGFloat radius = self.bounds.size.width*0.5f;

    // the point (radius, radius) is also the centre of the view, so...
    CGFloat squareOfDistanceFromCentre =
          (radius - point.x)*(radius - point.x) +
          (radius - point.y)*(radius - point.y);

    // if the point is too far away, return NO
    if(squareOfDistanceFromCentre > radius*radius) return NO;

    // otherwise we've exhausted possible reasons for answering NO
    return YES;
}
3 голосов
/ 26 марта 2012

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

[[слой кнопки] setCornerRadius: 8.0f];

вы также можете попробовать изменить радиус.

0 голосов
/ 08 марта 2013

Простой способ работы с pointInside на круглой кнопке такой:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (![super pointInside:point withEvent:event])
    {
        return NO;
    }
    BOOL isInside = (pow((point.x-self.frame.size.width/2), 2) + pow((point.y - self.frame.size.height/2), 2) < pow((self.frame.size.width/2), 2)) ? YES:NO;
    return isInside;
}

Вы можете отказаться от переменной 'isInside', но этот способ легче проверить.

0 голосов
/ 07 декабря 2012

Для этого я создал две круглые прямоугольные кнопки, одна из которых длинная и тонкая, а другая более широкая.Вместе они создают форму, похожую на пухлый знак плюс, который довольно близок к кругу, учитывая, что яблоко принимает 44 пикселя в качестве минимально удобного размера для печати.Если вы хотите, чтобы изображение было изменено, установите другое изображение в его imageView для выделенного состояния и подключите несколько действий (касание не будет достаточным, если вы хотите имитировать выделенное состояние кнопок в представлении изображения) двух кнопок.В качестве альтернативы вы можете добавить наблюдателей и изменить выделенное состояние просмотра изображения в соответствии с кнопками

0 голосов
/ 07 декабря 2012

Установите для userInteractionEnabled значение NO для меньшей кнопки 1. Все события перейдут к большей кнопке 2.

0 голосов
/ 26 марта 2012

Это довольно сложно, но возможно: Вы можете использовать только одну кнопку, но поставить некоторую проверку после события touchUpInside. Вы должны рассчитать, если эта точка касания находится внутри круга "button1". Для выполнения этой задачи вам необходимо иметь некоторые математические знания - Как рассчитать точку на окружности круга?

0 голосов
/ 26 марта 2012

Да, конечно, возможно.

Вы можете подключить одно действие с более чем одним селектором через IB.
Вы также можете вызвать метод, вызванный button2, непосредственно из метода, инициированного button1.

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