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

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

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

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


person Andrew Kolesnikov    schedule 20.11.2011    source источник
comment
Вы уверены, что не смогли найти документацию?: developer.apple.com/library/IOs/#documentation/UIKit/Reference/   -  person CodaFi    schedule 21.11.2011
comment
CodaFI уже ответила о документации... другая тема - этот пример, blog.brandoncopley.com/?p= 72 удачи   -  person silvaric    schedule 22.11.2011
comment
Может быть, вы ищете не тот SDK?   -  person Constantino Tsarouhas    schedule 22.11.2011
comment
Спасибо за импорт ‹UIKit/UIPopoverBackgroundView.h› :)   -  person Cesar    schedule 02.01.2012
comment
Вот учебник   -  person Andrew Kolesnikov    schedule 12.04.2012


Ответы (2)


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

  • Создайте новый подкласс UIPopoverBackgroundView
  • Объявите следующее в вашем интерфейсе:

    +(UIEdgeInsets)contentViewInsets;
    +(CGFloat)arrowHeight;
    +(CGFloat)arrowBase;
    
    @property(nonatomic,readwrite) CGFloat arrowOffset;
    @property(nonatomic,readwrite) UIPopoverArrowDirection arrowDirection;
    
  • Методы класса просты: contentViewInsets возвращает ширину ваших границ по всему периметру (не включая стрелку), arrowHeight — это высота вашей стрелки, arrowBase — это основание вашей стрелки.

  • Реализуйте два установщика свойств, убедившись, что вызывается [self setNeedsLayout].
  • В вашем методе инициализации создайте два представления изображения, одно из которых содержит вашу стрелку (которая должна быть размером с размеры стрелки в ваших методах класса), а другое содержит ваше фоновое изображение (которое должно быть изображением с изменяемым размером) и добавьте их как подпредставления. Неважно, где вы поместите подпредставления в этот момент, поскольку у вас нет направления стрелки или смещения. Вы должны убедиться, что вид изображения со стрелкой находится над видом фонового изображения, чтобы оно правильно сочеталось.
  • Implement layoutSubviews. In here, according to the arrowDirection and arrowOffset properties, you have to adjust the frames of your background view and arrow view.
    • The frame of your background view should be self.bounds, inset by arrowHeight on whatever edge the arrow is on
    • Рамка стрелочного вида должна быть выровнена так, чтобы центр находился на расстоянии arrowOffset от центра self (правильно по оси). Вы должны изменить ориентацию изображения, если направление стрелки не вверх, но мое всплывающее окно будет только вверх, поэтому я этого не сделал.

Вот метод layoutSubviews для моего подкласса только для Up:

-(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];

    }
}
person jrturton    schedule 07.09.2012

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

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

person user2067021    schedule 12.11.2015