UICollectionView に表示するために、ユーザーが写真ライブラリから画像を選択してキャプションを添付できる機能を備えたアプリを開発しています。ストーリーボードと自動レイアウトを使用しています。ユーザーがキャプションを入力するための基本的なテキストフィールド、画像ピッカーコントローラーを初期化するボタン、および選択された画像のサムネイルとユーザーが選択を変更することを決定したときの小さな「X」ボタン。
ユーザーが選択を行ったら、アニメーションで「画像の選択」ボタンを非表示にし、画像のサムネイルを保持している UIView をその場所に移動します。その後、サムネイルの隅にある [X] ボタンをクリックすると、UIView が下に戻り、[画像を選択] ボタンが再び表示されます。
私の問題は、ユーザーが選択をキャンセルしたときにアニメーションを動作させることができますが、選択を行ってイメージピッカーコントローラーから返されたときには動作しません。ビューはまったく移動しませんが、アニメーション コードをテストするために、「画像の選択」ボタンのアルファを 0.0 に設定すると、正しくアニメーション化されます!?
ここにいくつかのコードがあります:
// MyController.m
// When user hits the 'select image' button
- (void)selectImage
{
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
[self.imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
[self presentViewController:self.imagePicker animated:YES completion:nil];
}
// When user has selected an image from photo library
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
// Grab photo selection..
[self dismissViewControllerAnimated:YES completion:nil];
[self imageSelectionMade];
}
// Animation to hide button and move thumbnail up
- (void)imageSelectionMade
{
CGRect rect = self.thumbView.frame;
[UIView animateWithDuration:0.3 delay:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
self.buttonView.alpha = 0;
self.thumbView.frame = CGRectMake(rect.origin.x, (rect.origin.y - 76), rect.size.width, rect.size.height);
}completion:nil];
// Show 'X' button on corner of image
}
// Animation to move thumbnail down and display button again
- (void)imageSelectionCancelled
{
CGRect rect = self.thumbView.frame;
[UIView animateWithDuration:0.3 animations:^{
self.buttonView.alpha = 1.0;
self.thumbView.frame = CGRectMake(rect.origin.x, (rect.origin.y + 76), rect.size.width, rect.size.height);
}];
// Change image to 'placeholder' and hide 'X' button..
}
これと同様の問題に関して、ここでさまざまな投稿を読みましたが、問題を解決するものはないようです。ビューのフレームの代わりにビューの制約を操作してみました。これにより、両方のインスタンスでビューが所定の位置に「スナップ」されます。私は[self.view layoutIfNeeded]
効果がないものを試しました。画像ピッカーが表示される直前に最初のアニメーションのコードを配置しようとしましたが、明らかにピッカーが表示されます。恐れ入りますが、オートレイアウトを無効にする以外に何を試せばよいかわかりません (私の経験が限られていることと、オートレイアウトが残りの部分にどのように影響するかよくわからないという顔を考えると、オートレイアウトを無効にすることにあまり自信がありません)。応用)
誰がこれを引き起こしているのか知っていますか? サブビューの制約に関連しているとしか推測できませんが、なぜ私のimageSelectionCancelled
方法で機能するのですか?
注:Xcode 4.6を使用しています