Подтвердить что ты не робот

Блок анимации и завершения UIView

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

-(void)viewDidAppear:(BOOL)animated {
    if (TRUE) {
         NSLog(@"animating table view");

        [UIView animateWithDuration:.25
                         animations:^{
                             self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y - 60);
                         }
                         completion:^(BOOL finished){
                             NSLog(@"completion block");
                         }];
    }
}

"блок завершения" никогда не выводится... любые идеи?

EDIT:

Хорошо, поэтому он имеет какое-то отношение к моему UIREfreshControl:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (TRUE) {
        UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
        [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];

        [self setRefreshControl:refresh];
    }
}

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

ИЗМЕНИТЬ 2:

K, поэтому, если я просматриваю представление таблицы, тогда завершается блок завершения:

2013-02-15 13:37:06.266 [1922:14003] animating table view
2013-02-15 13:37:14.782 [1922:14003] completion block

написанный код должен записывать "блок завершения" сразу после "анимационного представления таблицы", но он имеет 8-секундную причину задержки, когда я прокручивал представление таблицы самостоятельно.

как выглядит "Pull to Refresh":

enter image description here

4b9b3361

Ответ 1

Я смог воспроизвести эту проблему и нашел обходной путь.

При использовании UIScrollView, который наследует UITableView, вы не можете изменить его contentOffset не является анимирующим свойством. Вместо этого вам нужно использовать метод setContentOffset:animated:.

Итак, вам нужно сделать следующее:

  • Установите контроллер вида в качестве делегата UITableView. Я сделал это на viewDidAppear.
  • Установите флаг, поэтому вы знаете в делетете, что свиток произошел, потому что вы активировали.
  • В методе делегата - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView отскакивайте анимацию (здесь вы можете добавить задержку с помощью performSelector:afterDelay:.

Здесь код:

@interface MyViewController ()

@property (assign, nonatomic) BOOL shouldReturn;

@end

@implementation MyViewController

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (TRUE) {
        NSLog(@"animating table view");
        self.shouldReturn = YES;
        self.tableView.delegate = self;
        [self.tableView setContentOffset:
                     CGPointMake(self.tableView.contentOffset.x,
                                 self.tableView.contentOffset.y - 60)
                                animated:YES];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (TRUE) {
        UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
        [refresh addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];

        [self setRefreshControl:refresh];
    }
}

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
    if (self.shouldReturn) {
        self.shouldReturn = NO;
        [self.tableView setContentOffset:CGPointZero animated:YES];
    }
}

@end

Ответ 2

Я использовал это и работал нормально. Его альтернативное решение.

[UIView animateWithDuration:0.5
                              delay:0.1
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^
         {
             CGRect frame = self.adBannerView.frame;

             self.adBannerView.frame = frame;
         }
                         completion:^(BOOL finished)
         {
         }];

попробуйте добавить задержку и параметры.