ユーザーがスライダーを引いたときに画面の左側から「スライドアウト」するメニューを含むビュー階層を作成しようとしています。メニューは、多数のセルを含むテーブルとして実装されます。各セルには画像とテキストがあります。テーブルサイズの変更をアニメーション化しています。自動レイアウトを使用しているため、コードは次のとおりです。
@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 に戻すと、奇妙なことが起こり始めます。ラベルのテキストは左にスライドし、画像によって部分的に隠されます。これがどのように見えるかです:
この瞬間から、メニューを前後にアニメーション化する限り、この厄介な効果を観察し続けます。誰かが同様の問題に遭遇しましたか? アニメーション中にラベルが再配置されないようにする方法はありますか? スーパービューのアニメーション中にサブビューが再レイアウトされる方法に関する適切なドキュメントへのポインタも高く評価されます。私はすでに数日間この問題に頭を悩ませてきましたが、何も見つかりませんでした。