Доступ к UIPageControl, созданному iOS6 UIPageViewController?

Я использую UIPageViewController с Навигацией, установленной на Горизонтальную, Стилем перехода, установленным на Прокрутку (в InterfaceBuilder), и без корешка. Что дает мне прекрасный интегрированный UIPageControl. Теперь я хочу иметь возможность переключать отображение (потому что под ним есть рисунок).

Я пытался установить presentationCountForPageViewController и presentationIndexForPageViewController для возврата 0, когда UIPageControl должен быть скрыт, но эти методы не вызываются, когда я хочу.

Делая паузу для трассировки стека, я вижу, что их вызывает [UIPageViewController _updatePageControlViaDataSourceIfNecessary]... Я предполагаю, что мое приложение будет отклонено, если я попытаюсь использовать этот метод.

Должен ли я искать его в подпредставлениях или сворачивать свои собственные, чтобы иметь над ним контроль, или есть какой-то лучший способ переключить его видимость?

Спасибо!


person Kaolin Fire    schedule 24.12.2012    source источник


Ответы (8)


Я бы сказал, поищите подвиды. Этот код успешно находит UIPageControl в иерархии подвидов:

NSArray *subviews = pageController.view.subviews;
UIPageControl *thisControl = nil;
for (int i=0; i<[subviews count]; i++) {
    if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) {
        thisControl = (UIPageControl *)[subviews objectAtIndex:i];
    }
}

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

Apple не предоставляет прямого интерфейса для UIPageControl через класс UIPageViewController, но для доступа к нему не требуется незаконных вызовов методов... Я не понимаю, почему это может привести к отклонению приложения.

person felixthecat    schedule 03.08.2013
comment
Спасибо. Это отражает ответ, который я отправил себе, который, по-видимому, был удален в мае... Хотя в моем решении, если это был класс UIPageControl, я setHidden:navhidden; и если это не так, я setClipsToBounds:!navhidden. Где navhidden переключается в звонилке.... - person Kaolin Fire; 03.08.2013
comment
У меня это не работает с Xcode 7.0.1 под управлением iOS 9.0. - person turingtested; 06.10.2015

В Swift:

    let subviews: Array = self.pageViewController.view.subviews
    var pageControl: UIPageControl! = nil

    for (var i = 0; i < subviews.count; i++) {
        if (subviews[i] is UIPageControl) {
            pageControl = subviews[i] as! UIPageControl
            break
        }
    }
person King-Wizard    schedule 23.05.2015
comment
это жалко, но пока я не узнаю о другом способе, +1. - person Dan Rosenstark; 08.06.2015
comment
Оставлю +1, но нашел другой способ (ниже). - person Dan Rosenstark; 08.06.2015

Вы можете получить доступ к этому для всех объектов PageControl, используя appearance (см. протокол UIAppearance), но для получения конкретного экземпляра вам придется использовать рекурсию. Свифт-код:

let pageControl = UIPageControl.appearance()
person Dan Rosenstark    schedule 07.06.2015
comment
Для конкретного экземпляра используйте UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClass.self]). iOS 9, только если вы используете Swift. - person Jon; 29.01.2016

Расширение Swift 3:

extension UIPageViewController {
    var pageControl: UIPageControl? {
        for view in view.subviews {
            if view is UIPageControl {
                return view as? UIPageControl
            }
        }
    return nil
    }
}
person Mike Bedar    schedule 02.12.2016

Я реализовал категорию, чтобы справиться с этим для меня, которая избавляет меня от беспорядка в моем коде и позволяет мне получить доступ к pageControl через "pageController.pageControl"

Цель-C

// Header
@interface UIPageViewController (PageControl)

@property (nonatomic, readonly) UIPageControl *pageControl;

@end

Я также использовал рекурсию (обрабатываемую блоками) на случай, если Apple решит изменить реализацию, в результате чего UIPageControl не будет находиться на первом уровне подвидов.

// Implementation
#import "UIPageViewController+PageControl.h"

@implementation UIPageViewController (PageControl)

- (UIPageControl *)pageControl
{
    __block UIPageControl *pageControl = nil;
    void (^pageControlAssignBlock)(UIPageControl *) = ^void(UIPageControl *blockPageControl) {
        pageControl = blockPageControl;
    };

    [self recurseForPageControlFromSubViews:self.view.subviews withAssignBlock:pageControlAssignBlock];

    return pageControl;
}

- (void)recurseForPageControlFromSubViews:(NSArray *)subViews withAssignBlock:(void (^)(UIPageControl *))assignBlock
{
    for (UIView *subView in subViews) {
        if ([subView isKindOfClass:[UIPageControl class]]) {
            assignBlock((UIPageControl *)subView);
            break;
        } else {
            [self recurseForPageControlFromSubViews:subView.subviews withAssignBlock:assignBlock];
        }
    }
}

@end

Это может быть излишним для ваших нужд, но это сработало для меня хорошо

person Adam Campbell    schedule 29.05.2015

Для Swift

Чтобы получить точки в элементе управления страницей, мы можем использовать

//dots will be an array of the dots views
let dots = pageControl.subviews

Чтобы получить текущий точечный вид

let currentDot = dots[pageControl.currentPage]

Чтобы получить другие точки просмотра

for i in 0..<dots.count {

    let dot = dots[i]

    if i == pageControl.currentPage {
        //dot => current dot



    } else {
        //dot => other dot

    }
}

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

dot.layer.borderColor = .green
dot.layer.borderWidth = 1
person Musa almatri    schedule 17.01.2017

Как насчет красивого, современного Swift 1-liner?

let pageControl = view.subviews.first { $0 is UIPageControl } as? UIPageControl

Или, если вам нравится расширение:

extension UIPageViewController {
    var pageControl: UIPageControl? {
        return view.subviews.first { $0 is UIPageControl } as? UIPageControl
    }
}
person Andrew Tetlaw    schedule 11.02.2019

Расширение С#:

public static class PageViewControllerExtension{
    public static UIPageControl GetPageControl(this UIPageViewController pageViewController){
        foreach (var view in pageViewController.View.Subviews){
            var subView = view as UIPageControl;
            if (subView != null){
                return subView;
            }
        }
        return null;
    }
}
person gots    schedule 01.03.2018