Использование класса UIPopoverBackgroundView

В приложении отсутствует документация о том, как использовать класс UIPopoverBackgroundView, введенный в iOS5. Кто-нибудь получил пример?

Я попытался сделать подкласс, но мой XCode 4.2 на Lion отсутствует UIPopoverBackgroundView.h

Изменить: Неудивительно, что он должен был быть импортирован как #import <UIKit/UIPopoverBackgroundView.h>

Ответ 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];

    }
}

Ответ 2

Еще одна ссылка ответит, но настройка UIPopoverBackgroundView - это больше, чем вы могли бы понять, учитывая ограниченную доступную документацию, и этот проект github имеет полный рабочий пример, который сэкономил мне много времени: https://github.com/GiK/GIKPopoverBackgroundView

Достаточно просто перейти в свой собственный проект. Самая сложная часть - это адаптация вложений для крышек для любых пользовательских изображений, которые вы используете. Я бы рекомендовал делать ваши настройки на месте в проекте, и так как легко проверить, чтобы все примеры использования/направления использования popover отображались правильно в симуляторе, прежде чем переносить его в свой собственный проект.