Использование класса UIPopoverBackgroundView - PullRequest
10 голосов
/ 21 ноября 2011

В Apple отсутствует документация по использованию класса UIPopoverBackgroundView, представленного в iOS5. У кого-нибудь есть пример?

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

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

Ответы [ 2 ]

13 голосов
/ 07 сентября 2012

Чтобы добавить другие ответы только для ссылок, вот как это делается.

  • Создание нового подкласса 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];

    }
}
1 голос
/ 13 ноября 2015

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

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

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