0

私は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];

...そして、スクロールビューの最後まで下に画像が表示された同様のボタンがあります。

これどうやってするの?

ミハイ

4

5 に答える 5

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;
}

とにかく、それを徹底的にテストするとき、それは見た目よりもすべてトリッキーです。巻物のアニメーションは控えることをお勧めします!

于 2013-03-14T15:30:48.717 に答える
1

このテーブルビューメソッドを定期的に呼び出すタイマーを作成します

[tableView scrollRowToVisible:nextRow++];

nextRowは、プロパティNSIntegerまたはグローバル/静的変数にすることができます。

于 2013-03-14T15:19:59.817 に答える
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];
    }
}
于 2013-03-14T15:20:26.390 に答える
0

私はまた、トリックを行ったこのコードを見つけました:

http://sugartin.info/2012/01/21/image-sliding-page-by-page-uiscrollview-auto-scrolling-like-image-slider/

水平ではなく垂直方向のスライドに適合させました。

ページごとですが、最終的には私のニーズに合っていました。

于 2013-03-15T10:55:03.307 に答える
0

この適応されたコードはトリックを行いました(各画像は280 x 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;
}
}
于 2013-03-15T11:18:54.787 に答える