2013-03-14 1 views
0

У меня есть scrollView, и мне нужно, чтобы он прокручивался очень медленно до самого конца, сам по себе, и когда пользователь прикасается к виду, он должен реагировать на жесты (вверх вниз). вместе с этим мне нужно поставить кнопку, которая останавливает/воспроизводит автопрокрутку.xcode Как я могу прокрутить прокрутку прокрутки очень медленно до конца без взаимодействия с пользователем?

код:

self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
self.scrollView.contentSize = CGSizeMake(320,4750); 
_scrollView.frame = CGRectMake(0, 44, 320, 420); 

UIButton *camilaButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[camilaButton setImage:[UIImage imageNamed:@"camila.jpg"] forState:UIControlStateNormal]; 
[camilaButton setImage:[UIImage imageNamed:@"camila.jpg"] forState:UIControlStateHighlighted]; 
camilaButton.frame = CGRectMake(20, 10, 280, 200); 

[self.scrollView addSubview:camilaButton]; 
[camilaButton addTarget:self action:@selector(onButtonPressCamila) forControlEvents:UIControlEventTouchUpInside]; 

UILabel *camilaLabel = [[UILabel alloc] initWithFrame:CGRectMake(40,220,100,30)]; 
camilaLabel.text = @"Camila"; 
[self.scrollView addSubview:camilaLabel]; 

... и затем есть аналогичные кнопки с изображениями ниже к концу Scrollview.

как я могу это сделать?

Михай

ответ

0

этот адаптированный код сделал трюк (каждое изображение 280 на 200):

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

UIScrollView *scr=[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
scr.tag = 1; 
scr.autoresizingMask=UIViewAutoresizingNone; 
[self.view addSubview:scr]; 
[self setupScrollView:scr]; 
UIPageControl *pgCtr = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 264, 480, 36)]; 
[pgCtr setTag:12]; 
pgCtr.numberOfPages=10; 
pgCtr.autoresizingMask=UIViewAutoresizingNone; 
[self.view addSubview:pgCtr]; 
} 

    - (void)setupScrollView:(UIScrollView*)scrMain { 
// we have 10 images here. 
// we will add all images into a scrollView & set the appropriate size. 

for (int i=1; i<=10; i++) { 
    // create image 
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"sti%02i.jpg",i]]; 
    // create imageView 
    UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(20, ((i-1)*scrMain.frame.size.height+100), 280, 200)]; 
    // set scale to fill 
    imgV.contentMode=UIViewContentModeScaleToFill; 
    // set image 
    [imgV setImage:image]; 
    // apply tag to access in future 
    imgV.tag=i+1; 
    // add to scrollView 
    [scrMain addSubview:imgV]; 
} 
// set the content size to 10 image width 
[scrMain setContentSize:CGSizeMake(scrMain.frame.size.width, scrMain.frame.size.height*10)]; 
// enable timer after each 2 seconds for scrolling. 
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(scrollingTimer) userInfo:nil repeats:YES]; 


} 

- (void)scrollingTimer { 
// access the scroll view with the tag 
UIScrollView *scrMain = (UIScrollView*) [self.view viewWithTag:1]; 
// same way, access pagecontroll access 
UIPageControl *pgCtr = (UIPageControl*) [self.view viewWithTag:12]; 
// get the current offset (which page is being displayed) 
CGFloat contentOffset = scrMain.contentOffset.y; 
// calculate next page to display 
int nextPage = (int)(contentOffset/scrMain.frame.size.height) + 1 ; 
// if page is not 10, display it 
if(nextPage!=10) { 


    [scrMain scrollRectToVisible:CGRectMake(0, nextPage*scrMain.frame.size.height, scrMain.frame.size.width, scrMain.frame.size.height) animated:YES]; 
    pgCtr.currentPage=nextPage; 
    // else start sliding form 1 :) 


} else { 

    [scrMain scrollRectToVisible:CGRectMake(0, 0, scrMain.frame.size.width, scrMain.frame.size.height) animated:YES]; 
    pgCtr.currentPage=0; 
} 
} 
1

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

[tableView scrollRowToVisible:nextRow++]; 

nextRow может быть свойством NSInteger или глобальной/статической переменной.

+0

Большое спасибо Anoop! – Mihai

+0

Какой ответ сработал для вас? любезно соглашайтесь с тем, чтобы другие могли знать, как решить эту проблему. –

+0

, вероятно, все ваши ответы в порядке; Я новичок и не мог проверить их все. я нашел другой код, который мне было проще реализовать. – Mihai

1
- (void) animateScroll:(NSTimer *)timerParam 
{ 
    const NSTimeInterval duration = 10.2; 

    NSTimeInterval timeRunning = -[startTime timeIntervalSinceNow]; 

    if (timeRunning >= duration) 
    { 
     [scrollView setContentOffset:destinationOffset animated:YES]; 
     [timer invalidate]; 
     timer = nil; 
     return; 
    } 
    CGPoint offset = [scrollView contentOffset]; 
    offset.y = startOffset.y + (destinationOffset.y - startOffset.y) * timeRunning/duration; 
    [scrollView setContentOffset:offset animated:YES]; 
} 

- (void) doAnimatedScrollTo:(CGPoint)offset 
{ 
    self.startTime = [NSDate date]; 
    startOffset = scrollView.contentOffset; 
    destinationOffset = offset; 

    if (!timer) 
    { 
     self.timer = 
     [NSTimer scheduledTimerWithTimeInterval:0.01 
       target:self 
       selector:@selector(animateScroll:) 
       userInfo:nil 
       repeats:YES]; 
    } 
} 
+0

спасибо большое Дэвиду! – Mihai

2

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

CGPoint theScrollPoint; 
theScrollPoint.x = 0; 
theScrollPoint.y = (nRegion * self.tableView.rowHeight) + 
dblPctIntoRegion * (self.tableView.rowHeight); 
[self.tableView setContentOffset: theScrollPoint animated:FALSE]; 

Если вы можете получить это приблизительно точка-точка (и вы скажем, медленно), он будет достаточно гладко и позволит избежать головной боли при обращении с ручным прокруткой пользователя во время анимации.

Если вы решите анимировать свою прокрутку программного обеспечения, будьте осторожны, если есть способы, которыми пользователь может щелкнуть прокрутку во время прокрутки программной прокрутки и т. Д., Чтобы вы могли вернуться в scrollViewDidEndScrollingAnimation повторно. Мне пришлось прибегнуть к хаку:

- (void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
{ 
    if(!m_bNoReentrantscroll) 
    { 
    m_bNoReentrantscroll = TRUE; 
    } 
    m_bNoReentrantscroll = FALSE; 
} 

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

+0

большое спасибо Уилсону! – Mihai