Подтвердить что ты не робот

UIPopoverController для iphone не работает?

Мне нужно использовать UIPopOverController для моего iPhone-приложения, я искал stackoverflow, кто-то сказал, что UIPopoverController не запускается на iphone-устройстве iphone ПОЧЕМУ. Когда я запускаю на устройстве iphone я получил эту ошибку reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

 -(void)btnSetRemainderTapped:(UIButton *)button
{
   setReminderView =[[SetRemainderView alloc]initWithNibName:@"SetRemainderView" bundle:[NSBundle mainBundle]];
setReminderView.contentSizeForViewInPopover = CGSizeMake(setReminderView.view.frame.size.width, setReminderView.view.frame.size.height);
setReminderView.delegate = self;
popOverController = [[UIPopoverController alloc]
                      initWithContentViewController:setReminderView] ;
 CGRect rect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 1, 1);
[popOverController presentPopoverFromRect:rect
                                        inView:self.view
                      permittedArrowDirections:UIPopoverArrowDirectionAny
                                      animated:YES];
}

Может кто-нибудь мне помочь?

4b9b3361

Ответ 1

Изменить: Как заявил Soberman, поскольку iOS 8 возможно, чтобы представить popovers на iPhone с использованием общедоступных API-интерфейсов, так что этот ответ, вероятно, больше не имеет отношения.


Как указано в документации Apple на UIPopoverController:

Контроллеры Popover предназначены исключительно для iPad.

Таким образом, к сожалению, нет возможности использовать этот класс в приложении для iPhone. Но есть несколько пользовательских сторонних реализаций функций, предоставляемых UIPopoverController, которые добавляют поддержку iPhone и многое другое. См. https://github.com/50pixels/FPPopover, например.

Изменить: есть и другая настраиваемая реализация popover для iPhone и iPad, которая стоит проверить: https://github.com/nicolaschengdev/WYPopoverController.

Ответ 2

Вы можете использовать popoverController в приложениях для iPhone.

1. Создать категорию

// UIPopoverController+iPhone.h file
@interface UIPopoverController (iPhone)
+ (BOOL)_popoversDisabled;
@end

// UIPopoverController+iPhone.m file
@implementation UIPopoverController (iPhone)
+ (BOOL)_popoversDisabled {
    return NO; 
} 
@end

2. Импортируйте его в свой класс и используйте popover в iPhone, как обычно.

Но помните, что это частный метод, и Apple может отклонить ваше приложение. Но я знаю людей, которые обычно используют это, и Apple опубликовала свои приложения.

Ответ 3

Так как iOS8 теперь может создавать popovers, это будет одинаково на iPhone, как на iPad, что было бы особенно удивительно для тех, кто делает универсальные приложения, поэтому нет необходимости создавать отдельные представления или код.

Вы можете получить класс, а также демонстрационный проект здесь: https://github.com/soberman/ARSPopover

Все, что вам нужно сделать, это подкласс UIViewController, соответствовать протоколу UIPopoverPresentationControllerDelegate и установить желаемый modalPresentationStyle вместе со значением delegate:

// This is your CustomPopoverController.m

@interface CustomPopoverController () <UIPopoverPresentationControllerDelegate>

@end

@implementation CustomPopoverController.m

- (instancetype)init {
    if (self = [super init]) {
        self.modalPresentationStyle = UIModalPresentationPopover;
        self.popoverPresentationController.delegate = self;
    }
    return self;
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone; //You have to specify this particular value in order to make it work on iPhone.
}

Затем создайте новый созданный подкласс в методе, из которого вы хотите его показать, и назначьте еще два значения sourceView и sourceRect. Это выглядит так:

CustomPopoverController *popoverController = [[CustomPopoverController alloc] init];
popoverController.popoverPresentationController.sourceView = sourceView; //The view containing the anchor rectangle for the popover.
popoverController.popoverPresentationController.sourceRect = CGRectMake(384, 40, 0, 0); //The rectangle in the specified view in which to anchor the popover.
[self presentViewController:popoverController animated:YES completion:nil];

И там у вас есть, хороший, аккуратный размытый popover.

Ответ 4

Итак, ответ @Sobermans действительно не решил проблему от начала до конца для меня, поэтому я хочу подробно рассказать о том, как я это сделал, используя документы. При этом мне нравится идея использования вашего собственного подкласса контроллера презентаций для управления всей настройкой, которую вы хотите отобразить.

1. Создайте свой контроллер для представления

Первым шагом является создание экземпляра контроллера, который вы хотите представить:

let vc: UIViewController = ...
vc.modalPresentationStyle = .Popover
vc.preferredContentSize = CGSize(width: CGRectGetWidth(view.bounds)/2, height: 100)

Теперь у нас есть контроллер с стилем презентации popover и произвольным размером содержимого.

2. Внедрить adaptivePresentationStyleForPresentationController

По умолчанию UIPopoverPresentationController будет отображаться в полноэкранном режиме на iPhone, поэтому, чтобы предотвратить это поведение, вам нужно заставить стиль адаптивной презентации ни к чему.

Сначала мы устанавливаем делегат контроллера представления popover

vc.popoverPresentationController.delegate = self;

Затем мы реализуем UIPopoverPresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return .None;
}

3. Представить и настроить всплывающее окно

Сначала нам нужно вызвать presentViewController, и только после этого мы можем настроить popover:

presentViewController(vc, animated:true, completion:nil)
if let popover = vc.popoverPresentationController {
    popover.permittedArrowDirections = .Right | .Left
    popover.sourceView = button
    popover.sourceRect = button.bounds
}

Ответ 5

Используйте настраиваемый контроллер popover, например:

https://github.com/sammcewan/WYPopoverController

(это, по-видимому, самый лучший, который я нашел).

Ответ 6

В итоге я создал свой собственный класс tooltip/popover.

Может быть инициализирован любым видом содержимого и динамически регулирует его.

Надеюсь, что это поможет.

https://github.com/akeara/AKETooltip

Ответ 7

Если вы хотите сделать это в Swift, я считаю, что код выглядит следующим образом:

extension UIPopoverController {
    class var _popoversDisabled : Bool {
    get { return false }
    }
}

Изменить: он работает в Xcode 6 beta 4 на iPhone с iOs7.1

Ответ 8

Это действительно интересный (и удручающий) поток для чтения. Я не могу поверить, что Apple предотвращает всплывающие диалоги на iPhone, без каких-либо оправданий.

И это правда, на iOS 8, если вы попытаетесь обойти это ограничение, это заставит ваши всплывающие окна появляться как полноэкранный модальный диалог.

Следующая превосходная веб-страница описывает "Как Apple Cheats" позволяет своим iBooks и iTunes приложениям нарушать свои собственные правила и разрешать всплывающие окна - но только из их собственных приложений для iPhone.

HowAppleCheats

Прочитайте (предупреждение: это заставит вас ненавидеть Apple и XCode еще больше.)

Хотите обойти "UIPopoverController, вызванный при запуске под UIUserInterfaceIdiomPad" на iOS 8?

Simple.

Просто зайдите в свой файл .plist и измените идентификатор Bundle на "com.apple.itunesu", чтобы XCode подумал, что ваше приложение на самом деле является iTunes.

Затем ваше всплывающее окно будет работать нормально.

enter image description here

(Вздох.)

Альтернативный способ сделать это - просто добавить ваш UIViewController на свой экран.

Popup

В этом примере я хотел, чтобы на экране iPhone появился "вспомогательный экран". Это a UIViewController, он хранится в нем собственный .xib файл, и у него есть несколько строк, чтобы добавить красивую рамку:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Give our popup a pretty curved border
    self.view.layer.borderColor = [[UIColor blueColor] CGColor];
    self.view.layer.borderWidth = 1.0;
    self.view.layer.cornerRadius = 8;    
}

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

-(void)showHelperScreen
{
    if (self.helperScreen == nil)
    {
        //  Add the popup UIViewController to our screen
        self.helperScreen = [[HelperViewController alloc] init];
        [self.view addSubview:self.helperScreen.view];
    }

    //  Center the popup in the middle of the screen
    CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size;
    self.helperScreen.view.center = CGPointMake(screenSize.width/2, screenSize.height/2);
}

Конечно, мне также нужно было добавить код, чтобы всплывающее окно исчезло, когда пользователь удалился за него, но это, по крайней мере, показывает, что вы можете (безопасно) отображать всплывающие окна на iPhone, даже если ваше приложение isn ' t специально называется iTunes или iBook.

Voila.

Надеюсь, что это поможет, и если кто-то понадобится мне, я вернусь в свое безопасное и счастливое место (другими словами, Visual Studio).