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

Objective-C

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

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

04.10.2014, 02:11. Просмотров 943. Ответов 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;

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

Оптимизация UIPageViewController - Программирование iOS
Добрый день, не так давно начал заниматься разработкой под iOS и столкнулся со следующей проблемой. Что имеется -...

Скроллинг текста с анимацией - Objective-C
Как реализовать такой скроллер, чтобы один из лейбл дойдя до верхней части экрана оставался вверху, а текст из другого лейбла скроллился...

скроллинг - ActionScript
делаю скрол по уроку, если создавать новый проект и копипастить код то все работает, в свой проект пытаюсь прикрутить - ничего не выводит....

скроллинг - jQuery
Здравствуйте! Есть простой код <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"...

Скроллинг - Assembler
Написал прогу в ассемблере, которая выводит 250 чисел. И вот какая проблема: я вижу только последние 20, которые помещаются в окне...

Скроллинг - Windows XP
После зажимания полосы прокрутки, полоса продолжает двигаться по движению мыши. Для того чтобы это отменить необходимо нажать левую кнопку...

13
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
04.10.2014, 04:08 #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).
1
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
04.10.2014, 12:56  [ТС] #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];
как это можно использовать?
0
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
04.10.2014, 20:50 #4
Не изощряйтесь)) Реализовывайте протоколы класса там, где их создаёте
1
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
04.10.2014, 21:07  [ТС] #5
edward_jonson, ок) я думал мало ли есть какая-нибудь еще крутая фича)

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

lowlol, а вы UIScrollView используете? если он будет занимать размеры больше, чем экран, он сам будет скроллиться(весь контент надо в него засунуть и правильно констрейнты расставить)
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.10.2014, 21:09 #10
edward_jonson, имел ввиду то, что не всегда нужно для UIView/сабклассов создавать UIViewController.
гораздо удобнее бывает создать отдельные UITableViewDataSource классы, которые следуя своей внутренней логике получают данные для UITableView отображения. По сети например, либо из файла, либо и то, и другое.
И тогда код, подобный следующему:
Objective-C
1
tableView.dataSource = [SomeDataSource new];
Будет и законным и удобным.
1
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
06.10.2014, 01:24  [ТС] #11
edward_jonson, у меня scrollview с контентом лежит внутри pageviewcontroller и поэтому свайпается только налвево и направо
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
06.10.2014, 08:39 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
lowlol, положите по UIScrollView на каждую "страницу", с contentSize бОльшим по вертикали, чем "страница", и он будет скроллится вверх-вниз.
0
lowlol
2 / 2 / 2
Регистрация: 02.12.2012
Сообщений: 102
06.10.2014, 18:49  [ТС] #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 включен, если это важно
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
06.10.2014, 19:33 #14
lowlol, разберитесь с тем, что такое bounds, frame, и что немаловажно, contentSize.

Подсказка: contentSize в xib вы не выставите
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2014, 19:33
Привет! Вот еще темы с ответами:

Скроллинг - HTML, CSS
На нескольких сайтах видел такое. Вверху всегда находится меню. При скроллинге вниз оно не пропадает. Все страницы всегда находятся...

Скроллинг - C (СИ)
Как реализовать на си, что-то типа скролинга. У меня есть программа, которая выводит данные ввиде таблицы, но когда информации много...

Скроллинг - Delphi
Вообщем на форме имеются компоненты с большими размерами, соответсвенно на форме появляются две полосы прокрутки вертикальная и...

Скроллинг! - C++
Такой вопрос - После создания скроллинга как его можно связать с загруженным в ресурсы bitmap в с++ API!?!? Добавлено через 3 часа 5...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
06.10.2014, 19:33
Ответ Создать тему
Опции темы

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