Доступ к 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;
    }
}