Автоматическая прокрутка UITextView Проблема - PullRequest
0 голосов
/ 19 ноября 2010

Я пытаюсь автоматически прокрутить текстовое представление и сбросить его до вершины, как только оно достигнет конца.

Я использую этот код:

-(void)scrollTextView
{

    CGPoint scrollPoint = stationInfo.contentOffset; 

    scrollPoint = CGPointMake(scrollPoint.x, scrollPoint.y + 2);

    if (scrollPoint.y == originalPoint.y + 100)
    {
        NSLog(@"Reset it");

        scrollPoint = CGPointMake(originalPoint.x, originalPoint.y);
        [stationInfo setContentOffset:scrollPoint animated:YES];

        [scroller invalidate];
        scroller = nil;

        scroller = [NSTimer
                    scheduledTimerWithTimeInterval:0.1
                    target:self
                    selector:@selector(scrollTextView)
                    userInfo:nil
                    repeats:YES];

    }
    else
    {
        [stationInfo setContentOffset:scrollPoint animated:YES];
    }

}

просмотр текста дико прыгает, но я не совсем понимаю, почему.Может быть, есть лучший способ определить, что текстовое представление находится внизу?Я неправильно установил значение scrollPoint?

Редактировать:

ВОПРОС РЕШЕН!Я остановился на NSTimer - отсутствующий ключ вызывал -display для слоя.

    -(void)scrollTextView
    {
        //incrementing the original point to get movement
        originalPoint = CGPointMake(0, originalPoint.y + 2);
        //getting the bottom
        CGPoint bottom = CGPointMake(0, [stationInfo contentSize].height);
        //comparing the two to detect a reset
        if (CGPointEqualToPoint(originalPoint,bottom) == YES) 
        {
            NSLog(@"Reset");
            //killing the timer
            [scroller invalidate];
            scroller == nil;
            //setting the reset point
            CGPoint resetPoint = CGPointMake(0, 0);
            //reset original point
            originalPoint = CGPointMake(0, 0);
            //reset the view.
            [stationInfo setContentOffset:resetPoint animated:YES];
            //force display
            [stationInfo.layer display];

            scroller = [NSTimer
                        scheduledTimerWithTimeInterval:0.1
                        target:self
                        selector:@selector(scrollTextView)
                        userInfo:nil
                        repeats:YES];
        }
        else
        {   
            [stationInfo setContentOffset:originalPoint animated:YES];
        }


}

1 Ответ

1 голос
/ 19 ноября 2010

Вы также можете использовать CoreAnimation и напрямую анимировать свойство bounds. Сначала анимируйте прокрутку, затем в обратном вызове делегата, который завершил анимацию, вы сбрасываете смещение содержимого.

Метод обратного вызова должен иметь подпись

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

Вы также можете использовать новые блочные методы, если вы ориентируетесь на iOS 4.0 и выше. Затем необходимо передать два блока: в первом вы указываете, что нужно анимировать, а во втором - что делать, когда анимация заканчивается.

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

Ваша проблема, чем сваливается в одну строку кода:

[stationInfo animateWithDuration:10.f delay:0.f options:0 animations:^{
    [stationInfo setContentOffset:CGPointMake(0, [stationInfo contentSize].height)];
} completion:^(BOOL finished){
    if (finished) [stationInfo setContentOffset:CGPointMake(0,0)];
}];

Если честно, я не на 100% уверен в точном синтаксисе блока, но именно так он и должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...