Чтобы добавить другие ответы только для ссылок, вот как это делается.
- Создание нового подкласса UIPopoverBackgroundView
Объявите следующее в вашем интерфейсе:
+(UIEdgeInsets)contentViewInsets;
+(CGFloat)arrowHeight;
+(CGFloat)arrowBase;
@property(nonatomic,readwrite) CGFloat arrowOffset;
@property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection;
Методы класса просты: contentViewInsets
возвращает ширину ваших границ по всему периметру (не включая стрелку), arrowHeight
- высота вашей стрелки, arrowBase
- основание вашей стрела.
- Реализуйте два установщика свойств, , убедившись, что вы вызвали
[self setNeedsLayout]
.
- В вашем методе инициализации создайте два представления изображения, одно из которых содержит вашу стрелку (которая должна быть размером с размеры стрелки в ваших методах класса), а другое - ваше фоновое изображение (которое должно быть изображением с изменяемым размером) и добавьте их как подвиды. Неважно, куда вы помещаете подпредставления в этой точке, так как у вас нет направления стрелки или смещения. Вы должны убедиться, что изображение со стрелкой находится над фоновым изображением, чтобы оно правильно сливалось.
- Реализация
layoutSubviews
. Здесь, в соответствии со свойствами arrowDirection
и arrowOffset
, вы должны настроить рамки фонового представления и представления со стрелкой.
- Рамка фонового представления должна быть
self.bounds
, вставлена arrowHeight
по любому краю, на котором находится стрелка
- Рамка вида стрелки должна быть выровнена так, чтобы центр находился на
arrowOffset
от центра self
(корректно по оси). Вы должны изменить ориентацию изображения, если направление стрелки не вверх, но мой поповер будет только вверх, поэтому я этого не делал.
Вот метод layoutSubviews
для моего подкласса Up-only:
-(void)layoutSubviews
{
if (self.arrowDirection == UIPopoverArrowDirectionUp)
{
CGFloat height = [[self class] arrowHeight];
CGFloat base = [[self class] arrowBase];
self.background.frame = CGRectMake(0, height, self.frame.size.width, self.frame.size.height - height);
self.arrow.frame = CGRectMake(self.frame.size.width * 0.5 + self.arrowOffset - base * 0.5, 1.0, base, height);
[self bringSubviewToFront:self.arrow];
}
}