UIView Callout Bubble - PullRequest
       20

UIView Callout Bubble

4 голосов
/ 26 декабря 2009

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

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 декабря 2009

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

Вам нужны два подкласса 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: для сенсорного объекта (чтобы убедиться, что вы обрабатываете нажатие, которое находилось за пределами пузырька).

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

1 голос
/ 02 ноября 2010

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

0 голосов
/ 26 декабря 2009

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

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

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

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