xcode如何使scrollView在没有用户交互的情况下非常缓慢地滚动到底?

xcode如何使scrollView在没有用户交互的情况下非常缓慢地滚动到底?,xcode,button,scroll,playback,autoscroll,Xcode,Button,Scroll,Playback,Autoscroll,我有一个scrollView,我需要它自己非常缓慢地向下滚动到最后,当用户触摸视图时,它应该响应手势(向上向下)。与此同时,我需要放置一个停止/播放自动滚动的按钮 守则: self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight; self.scrollView.conten

我有一个scrollView,我需要它自己非常缓慢地向下滚动到最后,当用户触摸视图时,它应该响应手势(向上向下)。与此同时,我需要放置一个停止/播放自动滚动的按钮

守则:

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的末尾有下面的图像

我该怎么做


Mihai

制作一个计时器,定期调用此表视图方法

[tableView scrollRowToVisible:nextRow++];

nextRow可以是属性NSInteger或全局/静态变量。

制作一个计时器,定期调用此表视图方法

[tableView scrollRowToVisible:nextRow++];
- (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];
    }
}

nextRow可以是属性NSInteger或全局/静态变量。

实现这一点的最简单方法可能是在没有动画的情况下从一点滚动到另一点:

- (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];
    }
}
CGPoint theScrollPoint;
theScrollPoint.x = 0;
theScrollPoint.y = (nRegion * self.tableView.rowHeight) +
dblPctIntoRegion * (self.tableView.rowHeight);
[self.tableView setContentOffset: theScrollPoint animated:FALSE];
如果您可以使其接近点对点(并且您确实说得很慢),它将足够平滑,并避免在动画期间手动处理用户滚动的头痛

如果您确实决定设置编程滚动动画,请注意,在您尝试以编程方式滚动时,通过用户轻弹滚动等方式,您可以重新进入ScrollViewDiEndScrollingAnimation。我不得不求助于黑客:

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

不管怎么说,这比你深入测试它时看起来要复杂得多。我建议放弃卷轴上的动画

最简单的方法可能是在没有动画的情况下从一点滚动到另一点:

CGPoint theScrollPoint;
theScrollPoint.x = 0;
theScrollPoint.y = (nRegion * self.tableView.rowHeight) +
dblPctIntoRegion * (self.tableView.rowHeight);
[self.tableView setContentOffset: theScrollPoint animated:FALSE];
如果您可以使其接近点对点(并且您确实说得很慢),它将足够平滑,并避免在动画期间手动处理用户滚动的头痛

如果您确实决定设置编程滚动动画,请注意,在您尝试以编程方式滚动时,通过用户轻弹滚动等方式,您可以重新进入ScrollViewDiEndScrollingAnimation。我不得不求助于黑客:

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

不管怎么说,这比你深入测试它时看起来要复杂得多。我建议放弃卷轴上的动画

我还发现了以下代码:

并将其调整为垂直滑动,而不是水平滑动


这是一页一页的,但最终它满足了我的需要。

我还发现了以下代码:

并将其调整为垂直滑动,而不是水平滑动


这是一页一页的,但最终它满足了我的需要。

这段经过修改的代码成功了(每幅图像为280 x 200):

-(void)viewDidLoad
{
[超级视图下载];
UIScrollView*scr=[[UIScrollView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];
scr.tag=1;
scr.autoresizingMask=uiviewsautoresizingnone;
[self.view addSubview:scr];
[自设置滚动视图:scr];
UIPageControl*pgCtr=[[UIPageControl alloc]initWithFrame:CGRectMake(0264480,36)];
[pgCtr setTag:12];
pgCtr.numberOfPages=10;
pgCtr.autoresizingMask=uiviewAutoresizingOne;
[self.view addSubview:pgCtr];
}
-(无效)设置滚动视图:(UIScrollView*)scrMain{
//我们这里有10张图片。
//我们将把所有图像添加到滚动视图中,并设置适当的大小。

对于(inti=1;i这段改编代码实现了这个技巧(每张图像是280 x 200):

-(void)viewDidLoad
{
[超级视图下载];
UIScrollView*scr=[[UIScrollView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];
scr.tag=1;
scr.autoresizingMask=uiviewsautoresizingnone;
[self.view addSubview:scr];
[自设置滚动视图:scr];
UIPageControl*pgCtr=[[UIPageControl alloc]initWithFrame:CGRectMake(0264480,36)];
[pgCtr setTag:12];
pgCtr.numberOfPages=10;
pgCtr.autoresizingMask=uiviewAutoresizingOne;
[self.view addSubview:pgCtr];
}
-(无效)设置滚动视图:(UIScrollView*)scrMain{
//我们这里有10张图片。
//我们将把所有图像添加到滚动视图中,并设置适当的大小。

对于(int i=1;我的答案对您有效?请接受这个答案,以便其他人知道如何解决此问题。可能您的所有答案都是可以的;但我是新手,无法测试所有答案。我找到了另一个更易于实现的代码。如果您使用其他不在此处的代码解决了此问题,您应该将其粘贴到此处,并接受:)我已经发布了它,明天我会接受它,因为系统还不允许我。此代码位于使用选项卡栏控制器的视图控制器中,当我在视图控制器之间切换时,它不会停止(我还在每张幻灯片上实现了声音)。你知道在更改视图后如何停止吗?哪个答案对你有效?请接受这个答案,以便其他人知道如何解决此问题。可能你所有的答案都是可以的;但我是新手,无法测试所有答案。我找到了另一个更容易实现的代码。如果你用另一个不是h的代码解决了问题在此,您应该将其粘贴到此处并接受:)我已经发布了它,明天将接受它,因为系统还不允许我使用。此代码位于使用选项卡栏控制器的视图控制器中,当我在视图控制器之间切换时,它不会停止(我在每张幻灯片上也实现了声音).你知道在更换视图后如何停止它吗?