0

モーダル ウィンドウのように表示/非表示にする UISegmentedControl があります。最初は、選択されたセグメントがありません。IB では、Value Changed イベントがメソッド (IBAction)cardClassificationChanged:(UISegmentedControl *)sender に関連付けられています。その方法は次のとおりです。

- (IBAction)cardClassificationChanged:(UISegmentedControl *)sender
{
    NSLog(@"%d", sender.selectedSegmentIndex);
    // block for updating the categorization of current card asynchronously
    [self.cardActionSheet hideWithAnimation];
}

最後の行 (-hideWithAnimation の呼び出し) をコメント アウトすると、選択が期待どおりに変更され、すべてが機能します。ただし、そのアニメーション メソッドの呼び出しでは、UISegmentedControl の選択はアニメーションの前に視覚的に変化しません。hideWithAnimation メソッドは次のとおりです。

- (void)hideWithAnimation
{
    CATransition *animation = [CATransition animation];
    animation.type = kCATransitionFade;
    animation.duration = globalAnimationLength;
    [self.layer addAnimation:animation forKey:nil];

    self.hidden = YES;
}

次回このビューが (タッチ ジェスチャから) 表示されると、UISegmentedControl で正しいセグメントが選択されます。

UISegmentedControl に対して setNeedsDisplay を呼び出す必要はないように思えますが、cardClassificationChanged メソッドまたは hideWithAnimation メソッドで試してみても、更新されません。

UI の更新に関連するものが明らかに不足しています。アニメーションの前に UISegmentedControl の選択を更新するには、何を呼び出す必要がありますか?

4

1 に答える 1

0

コントロールをフェードアウトするには、UIKitアニメーションを使用することをお勧めします。次のコードを試してください

- (void)hideWithAnimation
{
    [UIView animateWithDuration:0.2
                 animations:^{
                     self.alpha = 0.;
                 } completion:^(BOOL finished) {
                     self.alpha = 1.;
                     self.hidden = YES;
                 }];
}
于 2013-01-08T15:11:10.077 に答える