1

私はナビゲーション ベースのアプリを持っており、ルート コントローラー A によって viewController B がプッシュされると言います。これには、UITextFields を持ついくつかのセルを持つ UITableView があります。

最初の 2 つの UITextField には、inputView として、それぞれ UIDatePicker と UIPickerView があります。また、UIPickerView には、UIView が返される 4 つのコンポーネントがあります。

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 37)];
    label.text = [NSString stringWithFormat:@"%@%i", ((component == 3) ? @"." : @""), row];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont boldSystemFontOfSize:24];
    label.backgroundColor = [UIColor clearColor];
    [label autorelease];

    return label;
}

垂直方向では、UIPickerView は次のようになります。 ここに画像の説明を入力

私が気づいたことは次のとおりです。

ケース 1 - 正しい

  1. 私は垂直方向のviewController Aにいます。
  2. デバイス/シミュレーターを縦向きから横向きに回転させます
  3. viewController Bをプッシュします
  4. UIPickerView をポップアップさせます

ピッカー フレームは横向きモードに正しく引き伸ばされ、コンポーネント ビューは正しいサイズで中央に配置されます。

ここに画像の説明を入力

しかし

ケース 2 - 不正解

  1. 私は垂直方向のviewController Aにいます。
  2. viewController Bをプッシュします
  3. デバイス/シミュレーターを縦向きから横向きに回転させます
  4. UIPickerView をポップアップさせます

この場合、UIPickerView のコンポーネントがめちゃくちゃになります。

ここに画像の説明を入力

何かご意見は?

4

2 に答える 2

3

理由はわかりませんが、基本的-setNeedsLayoutに、デバイスが回転したときに入力ビューの呼び出しが欠落しています。

UIDatePicker (inputView = UIDatePicker) は、正しい向きに自動的に (再) 配置されるピッカーになりますが、UIPickerView (inputView = UIPickerView) はそうではありません。

そのため、UIPickerView が向きの変更などに登録されていないようです。手動で登録することで解決しました。つまり、セットアップ コードに次のように追加します。

[[NSNotificationCenter defaultCenter] addObserver:weightPicker 
                                         selector:@selector(setNeedsLayout) 
                                             name:UIDeviceOrientationDidChangeNotification   
                                              object:nil];

そして今、ピッカーは問題なく動作します。

また、textField の割り当てが解除される前に、NSNotificationCenter の登録を解除することを忘れないでください。

于 2012-03-21T05:56:57.427 に答える
1

記録のために、@SaldaVonSchwartz自身の回答の少しきれいなバージョン:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [myPickerView setNeedsLayout];
}

これは、myPickerView のサブビューのレイアウトを調整することを myPickerView に伝えます。トリックを行う必要があります。

于 2015-10-27T20:08:44.283 に答える