2

UIPickerView とツールバー (216 + 44) を備えたカスタム ビューがあります。初期化時 (viewDidLoad) に、このカスタム ビューは次のコードを使用して画面の下にプッシュされます。

   CGPoint newOrigin;
   newOrigin.x = pickerViewOutlet.frame.size.width/2;
   newOrigin.y = self.view.frame.size.height + ((pickerViewOutlet.frame.size.height)/2);
   NSLog(@"%f,%f",self.view.frame.size.height,(pickerViewOutlet.frame.size.height)/2);
   pickerViewOutlet.center = CGPointMake(newOrigin.x, newOrigin.y);

ボタンをクリックすると、次のコードを使用してこのビューが表示されます。

   [self.view bringSubviewToFront:pickerViewOutlet];
   NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height);
   CGPoint showOrigin;
   showOrigin.x = pickerViewOutlet.frame.size.width/2;
   showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height;
      //self.tabBarController.tabBar.frame.size.height ;
   NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height);
   [UIView beginAnimations:nil context:NULL];

   [UIView setAnimationBeginsFromCurrentState:YES];

   [UIView setAnimationDuration:0.5];
   pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y);


   [UIView commitAnimations];
   [pickerCtrlOutlet reloadAllComponents];

これはうまくいきます。ただし、コードが次のように変更されていても、ページに下部タブバーコントローラーが存在する場合、これは機能しません (ビューの一部がタブバーの下にあります)。

showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height -  self.tabBarController.tabBar.frame.size.height ;

ただし、上記のコードを次のように変更すると、

showOrigin.y = pickerViewOutlet.center.y - pickerViewOutlet.frame.size.height -  self.tabBarController.tabBar.frame.size.height - 90;

ビューがタブバーの真上にある場所で完全に機能します。

4

1 に答える 1

0

私の知る限り、viewDidLoadself.viewではまだスーパービューに追加されていないため、フレームが正しいサイズに設定されていません。

たとえば、InterfaceBuilder で UIView を設計すると、320x460 になります。スーパービューに追加すると、下部のタブ バーのために実際には小さくなります。自動サイズ変更メカニズムは、この問題に役立ちます。

したがって、viewDidLoad で間違った値を使用してピッカー ビューを配置していると思います。その後、古い位置に対して新しい位置を使用すると、依然として間違っています。

これが私がこれを書く方法です:

   [self.view bringSubviewToFront:pickerViewOutlet];
   NSLog(@"tabbar %f",self.tabBarController.tabBar.frame.size.height);
   CGPoint showOrigin;

   showOrigin.x = pickerViewOutlet.frame.size.width/2;
   //Notice this line -----------
   showOrigin.y = self.view.frame.size.height - pickerViewOutlet.frame.size.height / 2;

      //self.tabBarController.tabBar.frame.size.height ;
   NSLog(@"showpicker %f,%f",pickerViewOutlet.center.y,pickerViewOutlet.frame.size.height);
   [UIView beginAnimations:nil context:NULL];

   [UIView setAnimationBeginsFromCurrentState:YES];

   [UIView setAnimationDuration:0.5];
   pickerViewOutlet.center=CGPointMake(showOrigin.x, showOrigin.y);


   [UIView commitAnimations];
   [pickerCtrlOutlet reloadAllComponents];

知らせshowOrigin.y = self.view.frame.size.height - ...

そして(追加のポイントについて:)ピッカービューの自動サイズ変更マスクをフレキシブルトップに設定できます(または、ボトム座標をロックします)。これを行うと、ピッカービューをviewDidLoadに配置してからself.viewのサイズが変更されても、ピッカービューの位置も変更されます。

于 2012-05-03T15:07:54.450 に答える