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

Скрыть точки от UIPageViewController

Я хотел бы сделать это довольно просто. Просто удалите все точки и панель в нижней части UIPageViewController.

Это настройка: у меня есть настраиваемый контроллер представлений, у которого есть UIPageViewController * pageController Я показываю его так:

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

self.pageController.dataSource = self;
[[self.pageController view] setFrame:[self.view bounds]];

BSItemPageViewController *initialViewController = [self viewControllerAtIndex:selectedIndex];

NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];

Любые идеи о том, как удалить точки?

4b9b3361

Ответ 1

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

presentationCountForPageViewController:
presentationIndexForPageViewController:

Просто удалите их реализацию, и элемент управления страницы не будет отображаться. Из datasource docs:

Если оба метода в разделе "Поддержка индикатора страницы" реализованы, а стиль перехода к контроллеру страницы - UIPageViewControllerTransitionStyleScroll, отображается индикатор страницы.

Ответ 2

В моей ситуации у меня есть несколько UIPageViewControllers (созданные из - [UITableView didSelectRowAtIndexPath]), некоторые из которых содержат только 1 страницу. Вместо использования разных контроллеров для разных строк UITableView я реализовал метод делегирования UIPageViewController следующим образом:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}

Это возвращает 0, если есть только одна страница, которая, похоже, делает UIPageViewController не отображающим точки. Это kludge, но, похоже, он работает (iOS SDK 7.0).

Я полагаю, что "более чистый" способ заключается в том, чтобы удалить методы во время выполнения для этих UIPageControllers, имеющих только 1 страницу, но это будет связано с некоторыми причудливыми манипуляциями времени выполнения objC.

Комментарии к этому подходу?

Ответ 3

Если вы хотите скрыть эти точки динамически во время выполнения, верните -1 из делегата presentationIndexForPageViewController:

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count > 1 ? 0 : -1
}

В этом случае, если у вас есть только одна страница (односторонняя), точки будут скрыты.

Ответ 4

Вышеупомянутые исправления отлично работают с фиксированным количеством страниц в начале.

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

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

func togglePageControl(pageCount: Int, threshold: Int = 1) {

    var hidden = true

    if pageCount > threshold {

        hidden = false

    }

    for subView in self.view.subviews {
        if subView is UIScrollView {
            subView.frame = self.view.bounds
        } else if subView is UIPageControl {
            subView.isHidden = hidden
        }
    }
}

И это нужно вызывать из

public func presentationCount(for pageViewController: UIPageViewController) -> Int {

    togglePageControl(pageCount: pages.count)

    // or togglePageControl(pageCount: pages.count, threshold: 5)

    return pages.count
}

Ответ 5

Как указал Ли, просто не реализующие методы presentationCountForPageViewController и presentationCountForPageViewController страдают от проблемы доступности во время наложения голоса, когда он не считывает номер страницы (1 из 5, 2 из 5 и т.д.). Решение, которое будет поддерживать доступность:

// Swift
let proxy = UIPageControl.appearance()
proxy.isHidden = true

// Objective-C
UIPageControl *proxy = [UIPageControl appearance];
[proxy setHidden:YES];

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

ОБНОВИТЬ: К сожалению, это не идеальное решение, поскольку оно скрывает элемент управления, но не удаляет его (остается пустое пространство на той же высоте скрытого элемента управления). Я еще не смог найти способ настроить существующий элемент управления для решения этой проблемы.