Изменить скорость setContentOffset: animated :? - PullRequest
38 голосов
/ 10 декабря 2010

Есть ли способ изменить скорость анимации при прокрутке UITableView с помощью setContentOffset: animated :?Я хочу прокрутить его наверх, но медленно.Когда я пытаюсь выполнить следующее, это приводит к тому, что несколько нижних ячеек исчезают до начала анимации (в частности, те, которые не будут видны при выполнении прокрутки):

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3.0];
[self.tableView setContentOffset:CGPointMake(0, 0)];
[UIView commitAnimations];

Любой другой способ обойтипроблема?Существует закрытый метод _setContentOffsetAnimationDuration, который работает, но я не хочу, чтобы меня отклонили из магазина приложений.

Ответы [ 15 ]

0 голосов
/ 20 декабря 2016

Я хотел изменить contentOffSet таблицы, когда текстовое поле начинает редактироваться.

Swift 3.0

func textFieldDidBeginEditing(_ textField: UITextField) {

DispatchQueue.main.async { 
    UIView.animate(withDuration: 0, animations: {

     self.sampleTableView.contentOffset = CGPoint(x: 0, y: 0 - (self.sampleTableView.contentInset.top - 200 ))
    }) 
}    
}
0 голосов
/ 17 декабря 2015

В Xcode 7.1 - Swift 2.0:

func textFieldShouldEndEditing(textField: UITextField) -> Bool {

    dispatch_async(dispatch_get_main_queue()) {
        UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true) })
    }
    return true
}

ИЛИ

func textFieldShouldReturn(textField: UITextField) -> Bool {

    if(textField.returnKeyType == UIReturnKeyType.Next) {
        password.becomeFirstResponder()
    }

    dispatch_async(dispatch_get_main_queue()) {
        UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true) })
    }

    textField.resignFirstResponder()
    return true
}

Примечание: self.scrollView! .SetContentOffset (CGPointZero, animated: true) может иметь разные позиции в зависимости оттребование

Пример:

let scrollPoint:CGPoint = CGPointMake(0,textField.frame.origin.y/2);
scrollView!.setContentOffset(scrollPoint, animated: true);
0 голосов
/ 22 января 2014

Для людей, у которых также возникают проблемы с исчезновением элементов при прокрутке UITableView или UICollectionView, вы можете расширить само представление, чтобы у нас было больше видимых элементов. Это решение не рекомендуется в ситуациях, когда необходимо прокрутить большое расстояние, или в ситуациях, когда пользователь может отменить анимацию. В приложении, над которым я сейчас работаю, мне нужно было только прокрутить представление на фиксированные 100px.

NSInteger scrollTo = 100;

CGRect frame = self.collectionView.frame;
frame.size.height += scrollTo;
[self.collectionView setFrame:frame];

[UIView animateWithDuration:0.8 delay:0.0 options:(UIViewAnimationOptionCurveEaseIn) animations:^{
    [self.collectionView setContentOffset:CGPointMake(0, scrollTo)];
} completion:^(BOOL finished) {
    [UIView animateWithDuration:0.8 delay:0.0 options:(UIViewAnimationOptionCurveEaseIn) animations:^{
        [self.collectionView setContentOffset:CGPointMake(0, 0)];

    } completion:^(BOOL finished) {
        CGRect frame = self.collectionView.frame;
        frame.size.height -= scrollTo;
        [self.collectionView setFrame:frame];
    }];
}];
0 голосов
/ 11 февраля 2012

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

    [UIView animateWithDuration:1.2
                      delay:0.02 
                      options:UIViewAnimationCurveLinear  
                      animations:^{
     [colorPaletteScrollView setContentOffset: offset ];
 }
 completion:^(BOOL finished)
 { NSLog(@"animate");
 } ];

здесь colorPaletteScrollView - это мой пользовательский scrollview, а смещение - переданное значение.

этот код прекрасно работает для меня.

0 голосов
/ 10 декабря 2010

Существует ли причина, по которой вы используете setContentOffset, а не scrollRectToVisible: animated:?

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

Я бы порекомендовал сделать это так:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3.0];
[self.tableView scrollRectToVisible:CGRectMake(0, 0, 320, 0) animated:NO];
[UIView commitAnimations];

Если это не работает. Я все еще думаю, что вы должны попробовать это.

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