Ответ 1
Чтобы добавить к другому, ссылки только ответы, вот как это делается.
- Создайте новый подкласс 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
(правильный по оси). Вы должны изменить ориентацию изображения, если направление стрелки не вверх, но мой popover будет только вверх, поэтому я этого не делал.
- Рамка вашего фонового изображения должна быть
Вот метод layoutSubviews
для моего подкласса только для обновления:
-(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];
}
}