14

テーブルビューのオフセットを下にアニメーション化しようとしていますが、完了ブロックで上に移動します。しかし、私のコードは完了ブロックで何もしていません:

-(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");
                         }];
    }
}

「完了ブロック」が出力されることはありません...何かアイデアはありますか?

編集:

さて、それは私の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秒の遅延が発生します。

「PulltoRefresh」は次のようになります。

ここに画像の説明を入力してください

4

2 に答える 2

14

私はこれを使用し、正常に動作しました。その代替ソリューション。

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

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

遅延とオプションを追加してみてください。

于 2013-02-15T18:23:00.820 に答える
8

この問題を再現することができ、回避策を見つけました。

UIScrollViewから継承するを使用する場合、アニメーション化可能なプロパティではないUITableViewことを変更することはできません。contentOffset代わりに、メソッドを使用する必要がありますsetContentOffset:animated:

したがって、実行する必要があるのは次のとおりです。

  1. ビューコントローラをUITableViewデリゲートとして設定します。私はにやりましたviewDidAppear
  2. フラグを設定して、トリガーしたためにスクロールが発生したことをデリゲートで認識できるようにします。
  3. デリゲートメソッド- (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
于 2013-02-15T21:28:21.930 に答える