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