Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
#1

UIPageViewController + скроллинг вьюконтроллера - Objective-C

04.10.2014, 02:11. Просмотров 866. Ответов 13
Метки нет (Все метки)

У меня имеется UIPageViewController, который объявляется вот так
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mainPVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                                              navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
                                                            options:nil];
    mainPVC.dataSource = self;
    mainPVC.delegate = self;
    [[mainPVC view] setFrame:[[self view] bounds]];
    
    ChildViewController *initialViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
    
    
    [mainPVC setViewControllers:viewControllers
                      direction:UIPageViewControllerNavigationDirectionForward
                       animated:NO
                     completion:nil];
    [self.view addSubview:mainPVC.view];
ChildViewController заполнен ImageView и TextView
как осуществить скроллинг вниз и вверх?

пробовал через UISwipeGestureRecognizer и
Objective-C
1
[self.mainScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
Но не получилось

и еще один вопрос по теории (буду благодарен за любую ссылку не на документацию)
зачем нужны эти строчки? вернее, что они в точности делают
Objective-C
1
2
3
 
    mainPVC.dataSource = self;
    mainPVC.delegate = self;

Заранее спасибо
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2014, 02:11     UIPageViewController + скроллинг вьюконтроллера
Посмотрите здесь:

ActionScript скроллинг
Скроллинг Assembler
Windows XP Скроллинг
C# Синхронный скроллинг
Неправильный скроллинг
C++ Скроллинг!
Скроллинг изображения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
04.10.2014, 04:08     UIPageViewController + скроллинг вьюконтроллера #2
По поводу dataSource и delegate. Это так называемые "протоколы", в двух словах - набор методов, которые объявляются в одном классе, а реализуются в другом (типа интерфейсов). Ну так вот, ваш UIPageViewController создаётся в методе какого нибудь myViewController, у которого в объявлении есть строка типа
Objective-C
1
2
3
@interface myViewController() <UIPageViewControllerDelegate, UIPageViewControllerDataSource>
...
@end
Это значит, что этот класс (myViewController) обязуется реализовать протоколы UIPageViewControllerDelegate, UIPageViewControllerDataSource. Если просто их реализовать, никакого эффекта не будет, UIPageViewController "должен знать", откуда брать конкретную реализацию своих методов, для этого и служат строки
Objective-C
1
2
 mainPVC.dataSource = self;
 mainPVC.delegate = self;
Теперь, manPVC знает, что искать реализацию нужно в этом классе (self).
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
04.10.2014, 12:56  [ТС]     UIPageViewController + скроллинг вьюконтроллера #3
edward_jonson, спасибо, понял. Тогда еще один вопрос. В каких случаях целесообразно указывать источник реализации не self?
то есть допустим у меня есть класс
Objective-C
1
myClassA<UIPageViewControllerDataSource, UiPageViewController>
дальше создаю pageViewController и прописываю
Objective-C
1
2
pageViewControllerInstance.dataSource = [[ClassB alloc] init];
pageViewControllerInstance.delegate = [[ClassC alloc]init];
как это можно использовать?
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
04.10.2014, 20:50     UIPageViewController + скроллинг вьюконтроллера #4
Не изощряйтесь)) Реализовывайте протоколы класса там, где их создаёте
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
04.10.2014, 21:07  [ТС]     UIPageViewController + скроллинг вьюконтроллера #5
edward_jonson, ок) я думал мало ли есть какая-нибудь еще крутая фича)

Добавлено через 29 секунд
Вопрос про скролл еще актуален
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
04.10.2014, 21:17     UIPageViewController + скроллинг вьюконтроллера #6
Ну в принципе
Objective-C
1
2
pageViewControllerInstance.dataSource = [[ClassB alloc] init];
pageViewControllerInstance.delegate = [[ClassC alloc]init];
так делать законно, но мне кажется, не совсем удобно
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.10.2014, 08:52     UIPageViewController + скроллинг вьюконтроллера #7
edward_jonson, это пока вы пишете домашние развлечения, а не проект с нормальной архитектурой, в котором сотни классов.
Делегирование - мощных инструмент для составления нужной композиции.
По теме - Если у вас есть 4 разных UITableView для отображения на одном "экране", и 4 разных типов данных для них, и вы все методы протоколов UITableViewDataSource/Delegate реализуете в одном классе(<#Какой-то там#>ViewController - страндартная практика) - будет, мягко говоря, каша.
А вот есть вы создадите классы, которые обеспечивают разную реализацию для разных случаев(для каждого из UITableView), то получите что-то более-менее приемлимое.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
05.10.2014, 17:01  [ТС]     UIPageViewController + скроллинг вьюконтроллера #8
edward_jonson, по скроллингу можете что-нибудь подсказать?
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
05.10.2014, 20:27     UIPageViewController + скроллинг вьюконтроллера #9
zulkis, ну я не только домашние развлечения пишу, в реальных проектах 4 UITableView лучше по контейнерам и своим контроллерам разбить, по-моему, это и есть нормальная архитектура (поправьте, если не прав, ибо опыта реальных проектов относительно немного).

lowlol, а вы UIScrollView используете? если он будет занимать размеры больше, чем экран, он сам будет скроллиться(весь контент надо в него засунуть и правильно констрейнты расставить)
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.10.2014, 21:09     UIPageViewController + скроллинг вьюконтроллера #10
edward_jonson, имел ввиду то, что не всегда нужно для UIView/сабклассов создавать UIViewController.
гораздо удобнее бывает создать отдельные UITableViewDataSource классы, которые следуя своей внутренней логике получают данные для UITableView отображения. По сети например, либо из файла, либо и то, и другое.
И тогда код, подобный следующему:
Objective-C
1
tableView.dataSource = [SomeDataSource new];
Будет и законным и удобным.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
06.10.2014, 01:24  [ТС]     UIPageViewController + скроллинг вьюконтроллера #11
edward_jonson, у меня scrollview с контентом лежит внутри pageviewcontroller и поэтому свайпается только налвево и направо
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
06.10.2014, 08:39     UIPageViewController + скроллинг вьюконтроллера #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
lowlol, положите по UIScrollView на каждую "страницу", с contentSize бОльшим по вертикали, чем "страница", и он будет скроллится вверх-вниз.
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
06.10.2014, 18:49  [ТС]     UIPageViewController + скроллинг вьюконтроллера #13
zulkis, у меня есть класс ChildViewController и его xib-файл. В нем (в xib) накиданы UIImageView и UITextView.
Далее, в другом вьюконтролере, я создаю PageViewController и для каждой "страницы" создаю новый экземпляр класса ChildViewController:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
- (void)viewDidLoad
{
    [super viewDidLoad];
    //setting PVC
    mainPVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                                              navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
                                                            options:nil];
    mainPVC.dataSource = self;
    mainPVC.delegate = self;
    [[mainPVC view] setFrame:[[self view] bounds]];
    
    ChildViewController *initialViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
    
    
    [mainPVC setViewControllers:viewControllers
                      direction:UIPageViewControllerNavigationDirectionForward
                       animated:NO
                     completion:nil];
    
    /*****************/
    //TO DO: WHY I NEED THIS LINE???
    [self addChildViewController:mainPVC];
    /*****************/
    [self.view addSubview:mainPVC.view];
    /*****************/
    //TO DO:AND WHY I NEED THIS?
    [mainPVC didMoveToParentViewController:self];
    /*****************/
    //~
    
    //remove gap, caused by page control dots
    UIPageControl *thisControl = nil;
    for (int i=0; i<[viewControllers count]; i++) {
        if ([[viewControllers objectAtIndex:i] isKindOfClass:[UIPageControl class]]) {
            thisControl = (UIPageControl *)[viewControllers objectAtIndex:i];
        }
    }
    thisControl.hidden = true;
    mainPVC.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height+40);
    //~
    
    
 
}
 
- (ChildViewController *)viewControllerAtIndex:(NSUInteger)index {
    
    ChildViewController *childViewController = [[ChildViewController alloc] init];
    childViewController.index = index;
    
    return childViewController;
    
}
на стэковерфлоу есть пара открытых вопросов на эту тему, но ответов к ним нет
Кликните здесь для просмотра всего текста
http://stackoverflow.com/questions/20449225/vertical-uiscrollview-inside-horizontal-uipageviewcontroller-not-scrolling


Добавлено через 1 час 35 минут
zulkis, хм
Я ставил размеры scrollview в xib и это не сработало.
Но когда прописал это явно в коде, то заработало.
Objective-C
1
2
CGRect screenRect = [[UIScreen mainScreen] bounds];
[self.mainScrollView setContentSize:CGSizeMake(screenRect.size.width, 1100)];
почему так?
AutoLayout включен, если это важно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2014, 19:33     UIPageViewController + скроллинг вьюконтроллера
Еще ссылки по теме:

Objective-C Скроллинг текста с анимацией
Оптимизация UIPageViewController
Скроллинг Delphi
Скроллинг HTML, CSS
скроллинг jQuery

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
06.10.2014, 19:33     UIPageViewController + скроллинг вьюконтроллера #14
lowlol, разберитесь с тем, что такое bounds, frame, и что немаловажно, contentSize.

Подсказка: contentSize в xib вы не выставите
Yandex
Объявления
06.10.2014, 19:33     UIPageViewController + скроллинг вьюконтроллера
Ответ Создать тему
Опции темы

Текущее время: 18:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru