Я сделал это недавно.
Вам нужны два подкласса UIView: один внешний вид (рисует фон и обрабатывает выброс пузырька) и один внутренний (рисует сам пузырь). Я назвал мои IMPBubbleView и IMPBubbleInternalView.
В IMPBubbleView он устанавливает себя как размер текущего UIWindow, а затем добавляет себя как подпредставление окна. Вызывающая сторона должна передать прямоугольник, на который должен указывать пузырь: определите, где это находится в окне, выполнив convertRect: toView: (метод в UIView) и передав IMPBubbleView.
IMPBubbleView создает объект IMPBubbleInternalView и добавляет его в качестве подвида self.
Это должно сработать, если есть место, чтобы нарисовать пузырь ниже или выше прямоугольника (чтобы пузырь не попал за пределы экрана). Вы можете заставить пузырьковое представление принимать переданный в 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: для сенсорного объекта (чтобы убедиться, что вы обрабатываете нажатие, которое находилось за пределами пузырька).
Я думаю, что это все. У меня была куча вещей для добавления кнопок (я эмулировал меню копирования / вставки).