0

ユーザーがスライダーを引いたときに画面の左側から「スライドアウト」するメニューを含むビュー階層を作成しようとしています。メニューは、多数のセルを含むテーブルとして実装されます。各セルには画像とテキストがあります。テーブルサイズの変更をアニメーション化しています。自動レイアウトを使用しているため、コードは次のとおりです。

@interface MyController : UIViewController {
    CGFloat size;//0 .. self.frame.size.width * drawerPortion
    NSLayoutConstraint *constraint;
    UITableViewController *tableViewController;
}

// ...
@end

@implementation MyController
- (void)viewDidLoad {
//...
    UIView *view = tableViewController.view;
    [self.view addSubview:view];
    constraint = [NSLayoutConstraint constraintWithItem:view
                                                    attribute:NSLayoutAttributeWidth
                                                    relatedBy:NSLayoutRelationEqual
                                                       toItem:nil
                                                    attribute:NSLayoutAttributeNotAnAttribute
                                                   multiplier:1
                                                     constant:0];
    [view addConstraint:constraint];

    [self redrawTable];

}

- (void)makeDrawerVisible:(BOOL)visible {
    size = visible ? 224 : 0;
    [UIView animateWithDuration:0.5
                          delay:0
                        options:UIViewAnimationOptionLayoutSubviews
                     animations:^{[self redrawTable];}
                 }];
 }

- (void)redrawTable {
    constraint.constant = size;
    [self.view layoutIfNeeded];
}


// ...
@end

tableViewController、かなり基本的な教科書の実装ですUITableViewController。セルは次のように作成されます。

UITableCell *cell = [[UITableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.textLabel.text = @"Loren ipsum";
cell.imageView.image = [UIImage imageNamed:@"group"];

最初に、アプリを起動した後、メニューは幅 0 で作成されるため、非表示になります。次にスライダーを引くと、全体が指定された幅 (224) にうまくアニメーション化されます。これが私のエミュレーターのスクリーンショットです。アニメーションの途中のビューと最終結果です。

アニメーションの真ん中 - 正解 アニメーションの最終結果

テーブルをアニメートしてサイズ 0 に戻すと、奇妙なことが起こり始めます。ラベルのテキストは左にスライドし、画像によって部分的に隠されます。これがどのように見えるかです:

アニメーションの途中 - 不正解

この瞬間から、メニューを前後にアニメーション化する限り、この厄介な効果を観察し続けます。誰かが同様の問題に遭遇しましたか? アニメーション中にラベルが再配置されないようにする方法はありますか? スーパービューのアニメーション中にサブビューが再レイアウトされる方法に関する適切なドキュメントへのポインタも高く評価されます。私はすでに数日間この問題に頭を悩ませてきましたが、何も見つかりませんでした。

4

1 に答える 1

0

制約および/またはサイズ変更マスクがそれを行っています。制約操作を行う代わりに、スライド メニューを黒いビューの後ろに置き、メイン ビューを変換します (この場合は黒いビューを前後に移動します)。

if(isOpening)
{
    mainView.transform = CGAffineTransformTranslate(mainView.transform, someValueToShiftRight, 0.0f);
}
else
{
    mainView.transform = CGAffineTransformIdentity;
}
于 2013-10-17T13:51:39.773 に答える