Пузырь выноски UIView

Я хочу иметь возможность делать что-то вроде выноски MapView, когда пользователь касается UILabel в стандартном представлении. Это не карта! Или я могу навести курсор на новый UIView?

Кто-нибудь может указать мне правильное направление, пожалуйста?

Спасибо,


person Lee Armstrong    schedule 26.12.2009    source источник


Ответы (3)


Некоторый загружаемый код для чего-то подобного доступен в этом ответе.

person TinkerTank    schedule 02.11.2010

Я сделал это недавно.

Вам нужны два подкласса UIView: один внешний вид (рисует фон и управляет удалением пузыря) и один внутренний (рисует сам пузырь). Я назвал свои IMPBubbleView и IMPBubbleInternalView.

В IMPBubbleView он устанавливает себя равным размеру текущего UIWindow, а затем добавляет себя в качестве подпредставления окна. Вызывающий должен передать прямоугольник, на который должен указывать пузырь: определить, где он находится в окне, выполнив convertRect: toView: (метод в UIView) и передав IMPBubbleView.

IMPBubbleView создает объект IMPBubbleInternalView и добавляет его как подпредставление для себя.

Необходимо выяснить, есть ли место для рисования пузыря ниже или выше прямоугольника (чтобы пузырек не заканчивался за пределы экрана). Вы можете заставить пузырьковое представление отображать в нем переданный в UIView объект: это делает API наиболее многоразовым. Затем вы можете запросить размер этого представления. Немного простых математических расчетов и установите свойство bubbleOnTop для IMPBubbleInternalView.

Чтобы нарисовать сам пузырь, я портировал часть кода Мэтта Геммела (его можно найти по адресу http://mattgemmell.com/source), чтобы создать путь для контура пузыря. Затем я залил его градиентом следующих цветов:

    CGFloat locations[5] = { 0.0, 0.5, 0.65, 0.65, 1.0 };
CGFloat components[20] = { 0.0, 0.0, 0.0, 1.0,  // Start color
                          58.0/255, 58.0/255, 58.0/255, 1.0,
                          58.0/255, 58.0/255, 58.0/255, 1.0,
                          91.0/255, 91.0/255, 91.0/255, 1.0,
                          144.0/255, 144.0/255, 144.0/255, 1.0 }; // End color

Когда вы отображаете IMPBubbleInternalView, вы можете использовать Core Animation, чтобы заставить его плавно увеличиваться, или слегка увеличивать, а затем уменьшать, или что-то еще.

Наконец, вам нужно обрабатывать касания в IMPBubbleView (который рисует фон). Нажмите здесь, чтобы убрать пузырь. Переопределите touchesEnded: withEvent: и используйте метод locationInView: для сенсорного объекта (чтобы убедиться, что вы обрабатываете касание, находящееся за пределами пузыря).

Думаю, это все. У меня было много вещей для добавления кнопок (я эмулировал меню копирования / вставки).

person Amorya    schedule 27.12.2009

Мой подход заключался бы в создании png-изображения в стиле пузыря (полезно только для пузыря фиксированного размера, конечно), подкласса UIView и рисования этого изображения в фоновом режиме UIView при его создании, я бы также добавил UILabel или UIImage в зависимости от того, что я хотел сделать, будь то отображение текста или изображения.

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

Следующим шагом является создание подкласса UILabel и добавление метода, который отвечает на метод touchesBegan (UIResponder), который будет вызываться каждый раз при касании. Затем вы можете создать и отобразить пользовательское представление. Обычно я бы сказал создать делегата, однако я не думаю, что UILabel / UIView поддерживает это.

person Jonathan    schedule 26.12.2009