Как настроить / оформить UIPopoverController - PullRequest
33 голосов
/ 31 марта 2010

Я работаю над приложением для iPad и использую UIPopoverControllers. Я нахожусь в той части, где приложение должно быть фирменным и стилизованным, и мне интересно, как изменить цвет / оттенок UIPopoverController? Стандарт темно-синий, но должен быть другого цвета ..

возможно ли это?

Привет, Томас

Ответы [ 9 ]

51 голосов
/ 16 декабря 2011

Это возможно начиная с iOS 5.0 путем создания подкласса абстрактного класса UIPopoverBackgroundView и назначения вашего подкласса popoverBackgroundViewClass собственность на вашем UIPopoverController экземпляре. К сожалению, свойства tintColor нет, так как поповер должен использовать изображения для своей стрелки и границы, чтобы добиться плавной анимации во время динамического изменения размера. Вы можете узнать больше о том, как настроить внешний вид UIPopoverController в Справочнике по классу UIPopoverBackgroundView

21 голосов
/ 01 апреля 2010

Пока невозможно.

Это то, что я называю моделью "Коробка в коробке". Вы получаете контроль над коробкой внутри коробки (UIViewController внутри UIPopoverController), но у вас очень ограниченный контроль над самим поповером. За пределами направления стрелки и размера, вы не можете многое изменить. Есть также варианты для модального эффекта popover, который затемняет все остальное, когда он появляется, но я не пытался заставить его работать.

Я уверен, что вы заметили, что класса UIPopover сейчас нет.

Ответ, который вы хотите услышать:
Если вы действительно хотите создать такой плохой стиль, просто напишите свой. Это действительно не так сложно.

Ссылка, которую вы хотите нажать:
Cocoacontrols - это индекс компонентов iOS и OSX, доступных на GitHub, , у них есть некоторые всплывающие окна.

13 голосов
/ 16 ноября 2013

iOS 7 представляет backgroundColor свойство UIPopoverController, которое влияет на цвет фона навигации, а также на стрелки всплывающего окна.

@property (nonatomic, copy) UIColor *backgroundColor NS_AVAILABLE_IOS(7_0);

Пример использования:

    if ([self.popoverVC respondsToSelector:@selector(setBackgroundColor:)]) {   // Check to avoid app crash prior to iOS 7
        self.popoverVC.backgroundColor = [UIColor greenColor];   // [UIColor colorWithPatternImage:@"..."] doesn't reflect the color on simulator but on device it works!
    }

Примечание - На данный момент (iOS 7.0.3) в некоторых случаях (например, установка цвета с помощью colorWithPatternImage :) симулятор (и даже некоторые устройства) не поддерживает цвет.

8 голосов
/ 26 мая 2012

Бросаю сюда шляпу;

Я использовал UIPopoverBackgroundView s в iOS 5+, чтобы добавить простое свойство tintColor в UIPopoverController s.

PCPopoverController: https://github.com/pcperini/PCPopoverController

0 голосов
/ 29 августа 2013

с ios 5 и далее это можно сделать, вот библиотека

https://github.com/ddebin/DDPopoverBackgroundView

просто посмотрите документацию, и это довольно просто

удачи

0 голосов
/ 10 июля 2013

ознакомьтесь с этими последними проектами, используя UIPopoverBackgroundView https://github.com/CRedit360/C360PopoverBackgroundView https://github.com/GiK/GIKPopoverBackgroundView

0 голосов
/ 18 января 2012

Удалить границу UIPopoverController:

 NSArray* subviews = ((UIView*)[popupController.contentViewController.view.superview.superview.superview.subviews objectAtIndex:0]).subviews;
for(UIView *subview in subviews){
    [subview removeFromSuperview];
}
0 голосов
/ 15 августа 2011

Я пытаюсь обмануть его, настроив контроллер вида внутри поповера, а затем скрывая границу поповера, используя этот код:

UIView * border = [[insideViewController.view.superview.superview.superview subviews] objectAtIndex:0];  
border.hidden = YES;

Приложение на самом деле все еще находится в разработке, поэтому я надеюсь, что другие люди прокомментируют это решение.

0 голосов
/ 17 декабря 2010

Я знаю, что это паршивый ответ, но я просто играл с взглядами UIPopoverController. Они существуют.

Единственный способ получить к ним доступ с вашего взгляда, который находится в контроллере UIPopover.

У меня есть контроллер навигации, поэтому я следую этой иерархии

UIView *test = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]);
UIView *test2 = ((UIView *)[[[self.navigationController.view.superview.superview.subviews objectAtIndex:0] subviews] objectAtIndex:1]);
test.backgroundColor = [UIColor greenColor];
test2.backgroundColor = [UIColor greenColor];

Это не совсем конечная цель, но она действительно близка.

вы обнаружите, что the_view_in_the_popover.superview.superview (может быть, только одно суперпредставление, если вы не обращаетесь к представлению контроллера навигации) - это UIPopoverView. Если вы разыгрываете его как UIView и рассматриваете его как UIView, вы на самом деле не нарушаете никаких правил. Я думаю, что это действительно до яблока.

...