Как убрать нижний зазор UIPageViewController

Я использую UIPageViewController для отображения изображений в полноэкранном режиме, UIViewController, который добавляется в UIPageController в качестве подпредставления/дочернего элемента, имеет изображения, отображаемые с помощью ImageView. Проблема заключается в том, что изображения не отображаются в полноэкранном режиме, вместо этого в нижней части окна управления страницами появляются неправильные изображения, и это пространство полностью потрачено впустую. Пожалуйста, проверьте прикрепленное изображение.

введите здесь описание изображения

Вот код

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

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

NewsItemViewController *initialViewController = [self viewControllerAtIndex:0];

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

Здесь NewsItemViewController — это UIViewController, показывающий изображения и некоторый текст, а MainViewController реализует протокол UIPageViewControllerDataSource и необходимые методы в MainViewController.

Я считаю, что должен быть способ показать вещи в полноэкранном режиме.

*** Также MainViewController является частью раскадровки, если это имеет значение.


person vishal dharankar    schedule 12.11.2013    source источник
comment
Вместо этого вы должны использовать UIPageControl и UIScrollView, тогда у вас будет детальный контроль.   -  person Woodstock    schedule 12.11.2013
comment
Покажите нам некоторый код о том, как вы настроили контроллер просмотра страницы.   -  person bilobatum    schedule 13.11.2013
comment
@JohnWoods должен быть способ, поскольку UIPageViewController должен был заменить UIPageControl и ScrollView, плюс мне нужна гибкость при разработке представления в редакторе xib, которого я не получу в упомянутом вами подходе.   -  person vishal dharankar    schedule 13.11.2013
comment
@bilobatum добавил код, пожалуйста, проверьте. Я могу найти PageControl из UIPageViewController и скрыть его, но все же это место остается.   -  person vishal dharankar    schedule 13.11.2013
comment
Итак, приведенный выше код выглядит хорошо. Так что мы можем исключить это как проблему. Давайте искать в другом месте. Содержит ли ваш NewsItemViewController какой-либо код макета?   -  person bilobatum    schedule 13.11.2013
comment
@bilobatum нет, это просто макет с использованием редактора xib, простой UIImageView, который охватывает весь вид, вот и все, я ожидал, что будет показан весь вид, но затем этот пробел скрывает нижнюю часть изображения   -  person vishal dharankar    schedule 13.11.2013
comment
Вы используете автоматическую раскладку?   -  person bilobatum    schedule 13.11.2013
comment
давайте продолжим это обсуждение в чате   -  person bilobatum    schedule 13.11.2013
comment
Пробовал удалить авторазметку отовсюду.   -  person vishal dharankar    schedule 13.11.2013
comment
@bilobatum я в чате   -  person vishal dharankar    schedule 13.11.2013
comment
Как мы можем сделать контрольный индикатор над изображением, а не удалять его. Пока вы делаете, как вы предложили, индикатор управления теряется   -  person Nischal Hada    schedule 25.09.2015
comment
@nischalhada сделать фон индикатора четким   -  person vishal dharankar    schedule 25.09.2015


Ответы (6)


Наконец, я сам нашел решение. Я просто скрываю элемент управления страницей из UIViewPageController, а затем увеличиваю размер UIPageViewController, чтобы закрыть пробел, оставшийся из-за отсутствия управления страницей.

 NSArray *subviews = self.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];
    }
}

thisControl.hidden = true;
self.pageController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+40);
person vishal dharankar    schedule 13.11.2013
comment
Спасибо за хорошее решение, сэкономил мне кучу времени! - person Julius; 27.01.2014
comment
Можно ли сделать контрольный индикатор над самим изображением, а не убирать его? Я хочу этого, потому что у пользователя нет указания, что он может провести пальцем, удалив индикатор. - person Nuno Gonçalves; 19.02.2015
comment
@NunoGonçalves, используя приведенный выше код, вы получаете доступ к UIPageControl, вы можете сделать его цвет фона четким и добиться этого, в основном вы можете настроить индикатор, как только получите к нему доступ, что выше описано, как это сделать. - person vishal dharankar; 19.02.2015
comment
@vishal Я пробовал ваш метод, чтобы показать UIPageControl над содержимым, но он не появляется, несмотря ни на что. - person M Abdul Sami; 11.12.2015

Любопытный. В документах говорится:

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

Эти два метода:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { 
}

Вы реализуете эти два метода источника данных? Если это так, возможно, если вы удалите их, вам не придется вручную удалять элемент управления страницей (точки)? Быстрым тестом было бы изменить

UIPageViewControllerTransitionStyleScroll

to

UIPageViewControllerTransitionStylePageCurl

и посмотрите, исчезнут ли точки индикатора управления страницей. (Конечно, после комментирования вашего метода скрытия.)

person Michael J.    schedule 16.11.2013
comment
согласен, но мне нужны эти методы, я думаю, они нужны для предоставления необходимых данных просмотра при прокрутке. - person vishal dharankar; 20.11.2013
comment
Вы были правы, индикатор управления страницей исчезает, если вы переключаетесь на стиль перехода PageCurl. - person Julius; 27.01.2014
comment
Удаление двух описанных выше методов также привело к удалению точек и пробелов. Успех! - person AlexanderN; 16.02.2014
comment
точки исчезают, когда вы удаляете процедуры презентацияCountForPageViewController и презентацияIndexForPageViewController. Но что, если вам нужен такой сценарий ›› — мы хотим, чтобы точки оставались! - фон из точек должен исчезнуть! - вид прокрутки внутри управления просмотром страниц должен занимать весь экран - фон управления страницами не должен обрезать вид! - person Add080bbA; 22.08.2014
comment
Получите доступ к отдельному представлению и измените его так, как я проверил свой ответ на подсказку. - person vishal dharankar; 22.08.2014

Точки UIPageViewController отображаются только в том случае, если вы реализовали следующий метод:

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController;

проверьте свой код. а также возврат нуля в этом методе скроет точки (UIPageControl)

person g.revolution    schedule 27.02.2015
comment
Я хотел удалить черную полосу, если вы внимательно прочитали, описанный выше метод просто удалит точки, а не пробел. - person vishal dharankar; 01.03.2015
comment
это так, может быть какая-то другая проблема с кодом. он полностью удаляет полосу. - person g.revolution; 02.03.2015
comment
Идеально, именно то, что мне было нужно. - person Drew; 24.03.2015

Я добавляю для быстрого кода, совместимого с 2.2

for view in self.view.subviews {
    if view.isKindOfClass(UIScrollView) {
        view.frame = UIScreen.mainScreen().bounds
    } else if view.isKindOfClass(UIPageControl) {
        view.backgroundColor = UIColor.clearColor()
    }
}

Это совместимое со Swift 4 решение, встроенное в viewDidLayoutSubviews

for view in self.view.subviews {
    if view.isKind(of:UIScrollView.self) {
        view.frame = UIScreen.main.bounds
    } else if view.isKind(of:UIPageControl.self) {
        view.backgroundColor = UIColor.clear
    }
}
person ZaEeM ZaFaR    schedule 10.05.2016

Быстрая версия :). Верните ноль для реализации ниже внутри подкласса UIPageViewController. функция представленияCountForPageViewController(pageViewController: UIPageViewController) -> Int {возврат 0}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }
person deepax11    schedule 03.11.2015

Установите контроллер пейджера так

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

И реализовать, этот метод должен возвращать любое значение больше 1

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
    // The selected item reflected in the page indicator.
    return 2;
}

Теперь пробел в нижнем пространстве удален, и элемент управления страницей не отображается :)

person SMS    schedule 06.04.2016