Несколько вопросов о ScrollView с PageControl

Я довольно новичок в разработке для iOS, и я наткнулся на несколько вопросов, на которые я пока не мог легко найти ответы:

Общая настройка: я использую ScrollView с PageControl внутри TabBarApplication

  1. Можно ли разместить PageControl в той же области, что и содержимое страниц? Для меня это всегда скрывается представлениями SrollView, но из-за того, что пространство на экране является редким, оно мне действительно нужно на той же высоте, что и фактический контент.

  2. Я дурачился в каком-то Sandbox-проекте, и всякий раз, когда я впервые начал внедрять кнопку в представление ScrollView-Page, страницы ScrollView больше не показывались бы сразу, но только после первой попытки прокрутки. Я бы опубликовал некоторый код об этом, но он в основном только сгенерирован автоматически из IB.

  3. Это опять общий вопрос о возможностях: основным проектом проекта должен быть TabBarApplication с NavigationController, позволяющий углубиться в подменю, как это довольно часто встречается. Теперь на одной из вкладок должен быть PageControl, в котором вы можете снова войти в подменю, нажав Views в стеке NavigationController. Это возможно?

Какой-то код для 2.

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
    [controllers addObject:[NSNull null]]; // [TaskPageViewController new]];
}
self.viewControllers = controllers;
[controllers release];

// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;

pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;

}
- (IBAction)changePage:(id)sender {
int page = pageControl.currentPage;
// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
// update the scroll view to the appropriate page
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
// Set the boolean used when scrolls originate from the UIPageControl. See scrollViewDidScroll: above.
pageControlUsed = YES;

}

- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= kNumberOfPages) return;

// replace the placeholder if necessary
TaskPageViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
    controller = [[TaskPageViewController alloc] init]; //WithPageNumber:page];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

// add the controller's view to the scroll view
if (nil == controller.view.superview) {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView addSubview:controller.view];
}
}

- (void)scrollViewDidScroll:(UIScrollView *)sender {
// We don't want a "feedback loop" between the UIPageControl and the scroll delegate in
// which a scroll event generated from the user hitting the page control triggers updates from
// the delegate method. We use a boolean to disable the delegate logic when the page control is used.
if (pageControlUsed) {
    // do nothing - the scroll was initiated from the page control, not the user dragging
    return;
}
// Switch the indicator when more than 50% of the previous/next page is visible
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;

// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];

// A possible optimization would be to unload the views+controllers which are no longer visible
}

1 ответ

  1. Вы можете иметь две иерархии представления для этого:

    • Имейте контроль страницы в scrollview с источником, установленным в contentOffset имущество
    • Имейте контроль страницы в суперпредставлении scrollView, но с более высоким индексом (то есть плавающий над ним)
  2. Это зависит от того, куда вы положили код добавления подпредставлений. Это в методе делегата scrollView? viewDidLoad? Где-нибудь еще? Некоторый код может помочь.

  3. Не знаю, зачем вам нужен элемент управления страницей, когда вы переходите по иерархии. Страницы предназначены для навигации по элементам одного уровня.

Другие вопросы по тегам