7

iOS7 iPhone アプリの UISegmentedControl バグを解決できません。

セグメント化されたコントロールを作成するときは、次のコードを使用します。

NSArray *segmentedControlItemArray = [NSArray arrayWithObjects: @"Nominal:\n27 inch", @"Actual:\n700c x 23mm", @"Actual:\n700c x 20mm", nil];
_wheelDiameterSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentedControlItemArray];
_wheelDiameterSegmentedControl.frame = CGRectMake(0, 102, 290, 50);
_wheelDiameterSegmentedControl.selectedSegmentIndex = 0;
_wheelDiameterSegmentedControl.tintColor = [UIColor colorWithRed:0.35 green:0.4 blue:0.9 alpha:1.0];

for (id segment in [_wheelDiameterSegmentedControl subviews]) {
    for (id label in [segment subviews]) {
        if ([label isKindOfClass:[UILabel class]]) {
            UILabel *titleLabel = (UILabel *) label;
            titleLabel.numberOfLines = 0;   
        }   
    }  
}

[_wheelDiameterSegmentedControl addTarget:self
                     action:@selector(pickOne:)
           forControlEvents:UIControlEventValueChanged];

[_wheelDiameterMenuContainer addSubview:_wheelDiameterSegmentedControl];

悲しいことに、画像を投稿することはできません。または、必要なコントロールの写真をお見せしたいと思います。UISegmented コントロールの各セグメントには 2 行のテキストがあり、必要な場所に改行があります。

ただし、回転時には、セグメント化されたコントロールを全幅に保ちたいと思います。その幅のセグメントでは、改行がばかげて見えます。そのため、willAnimateRotationToInterfaceOrientation には、文字列に改行を入れずに次のコードを含めました。

    [_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 450, 50)];
    [_wheelDiameterSegmentedControl setTitle:@"Nominal: 27 inch" forSegmentAtIndex:0];
    [_wheelDiameterSegmentedControl setTitle:@"Actual: 700c x 23mm" forSegmentAtIndex:1];
    [_wheelDiameterSegmentedControl setTitle:@"Actual: 700c x 20mm" forSegmentAtIndex:2];

繰り返しになりますが、画像を挿入できれば、正確に必要な画像を表示できます。つまり、ラベルに改行がない幅の広い UISegmented コントロール (ラベルごとに 1 行のテキスト) です。

ここで私はトラブルに遭遇します。縦向きに戻すときの私の選択は次のようです。

次の形式の 1 行のラベル テキスト (切り捨て)

「実際: 7...」

を使用して UISegmentedControl のサイズをリセットしたとき

[_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 290, 50)];

切り捨てられた 2 行のラベル テキスト (次の形式)

「実際:
700c x ...」

サイズをリセットし、文字列値もリセットして、ラベルの numberOfLines を 2 に設定するコードのループを再実行すると、

    NSArray *segmentedControlItemArray = [NSArray arrayWithObjects: @"Nominal:\n27 inch", @"Actual:\n700c x 23mm", @"Actual:\n700c x 20mm", nil];

    [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:0] forSegmentAtIndex:0];
    [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:1] forSegmentAtIndex:1];
    [_wheelDiameterSegmentedControl setTitle:[segmentedControlItemArray objectAtIndex:2] forSegmentAtIndex:2];
    for (id segment in [_wheelDiameterSegmentedControl subviews]) {
        for (id label in [segment subviews]) {
            if ([label isKindOfClass:[UILabel class]]) {
                UILabel *titleLabel = (UILabel *) label;
                titleLabel.numberOfLines = 2;
            }
        }
    }
    [_wheelDiameterSegmentedControl setFrame:CGRectMake(0, 102, 290, 50)];

次の形式の 3 行のラベル テキスト

「実寸:
700c×
20mm」

これは、上記の強制的な numberOfLines = 2 を、最初に UISegmentedControl を設定したときに機能した numberOfLines = 0 に置き換えると得られるものです。

私が望むのは、コントロールを作成したときに得られるものです。

「実寸:
700c×20mm」

しかし、私が何を試しても (文字列と numberOfLines コードを willRotateToInterfaceOrientation または didRotateFromInterfaceOrientation に入れる; テキストを変更する前に UISegmentedControl のフレームを再設定する; テキストを変更した後にフレームを再設定する...)、できます。素敵できちんとした 2 行のラベルが戻ってきません。ここで何が欠けていますか?

4

3 に答える 3

8

あはは!ラベルの回転時に OS がラベルのサイズを処理する方法は、作成時のラベルの処理方法とは異なります。だから私はラベルのフレームのサイズを強制しました

for (id segment in [_wheelDiameterSegmentedControl subviews]) {

    for (id label in [segment subviews]) {

        if ([label isKindOfClass:[UILabel class]]) {

            UILabel *titleLabel = (UILabel *) label;

            //inserting line here, to make the frame behave nicely:
            //
            titleLabel.frame = CGRectMake(0, 0, 97, 50);
            //
            //continuing as before

            titleLabel.numberOfLines = 0;

        }
    }
}

そして今、私が望む/期待どおりに正確に表示されます。ハザ!


UISegmentedControl で 2 行 (またはそれ以上) のテキストを取得しようとしている場合。Herzianの驚異の技術を使用!これは、人々を助けるかもしれない別のコード例です...

self.yourSlider .. set the height manually (can't easily do it in XIB)
// now use amazing Herzian technology...
for (id segment in [self.yourSlider subviews])
    for (id label in [segment subviews])
        {
        if ([label isKindOfClass:[UILabel class]])
            {
            UILabel *titleLabel = (UILabel *) label;
            titleLabel .. set the width to say 80, per your layout;
            (the width us typically too low)
            titleLabel.numberOfLines = 0;
            }
        }

どうもありがとうございました。

于 2013-11-09T23:14:32.607 に答える