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

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

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

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

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

спасибо!

7 ответов


Я бы сказал, поищите в подвидах. Этот код успешно находит 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, но для его получения не требуется никаких незаконных вызовов методов... Я не понимаю, почему это приведет к отклонению приложения.


на Свифт:

    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
        }
    }

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

С

// 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

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


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

let pageControl = UIPageControl.appearance()

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

extension UIPageViewController {
    var pageControl: UIPageControl? {
        for view in view.subviews {
            if view is UIPageControl {
                return view as? UIPageControl
            }
        }
    return nil
    }
}

Для 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

расширение C#:

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;
    }
}