web-dev-qa-db-ja.com

iOS 7でiOS 6スタイルのセグメント化されたコントロールを使用しますか?

IOS 7デバイス上のセグメント化されたコントロールをiOS 6バージョンのコントロールとして表示することは可能ですか?

インターフェースの再設計の準備ができていないので、新しいフラットコントロールが他のUIと連動しません。可能であれば、今のところiOS 6スタイルを維持することは間違いなく最善です。

明確にするために、私はiOS 6.1 Base SDKを使用してコンパイルしています。これが私の質問に対する「明白な」答えであることは承知していますが、機能しません。これを行うと、他のほとんどのUI要素がiOS 6のスタイルで表示されますが、UIAlertViewUIActionSheetと同様に、UISegmentedControlは表示されません。ただし、UIAlertViewおよびUIActionSheetとは異なり、UISegmentedControlsは「システム」アイテムのように感じません。 iOS 6モードで表示できるはずです。

編集:私は最終的にこれを含む写真を含めると役立つと思いました(おそらく最初からこれを行うべきでした)。しかし、私が提供した答えは問題を解決しました。また、振り返ってみると、このように見えますmight結局のところiOS 6スタイルです。表示が間違っているため、iOS 7スタイルのように見えます。

enter image description here

15
MikeS

私はすべての属性を手動で設定することによってこの問題を解決するのにかなり良い仕事をすることができましたが、それは完全ではありません。

これは私がやったことです:

- (void)fixSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIFont boldSystemFontOfSize:12], UITextAttributeFont,
                                [UIColor whiteColor], UITextAttributeTextColor,
                                nil];
    [self.segmentedControl setTitleTextAttributes:attributes forState:UIControlStateNormal];
    NSDictionary *highlightedAttributes = [NSDictionary dictionaryWithObject:[UIColor whiteColor] forKey:UITextAttributeTextColor];
    [self.segmentedControl setTitleTextAttributes:highlightedAttributes forState:UIControlStateHighlighted];

    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    self.segmentedControl.tintColor = [UIColor colorWithRed:49.0 / 256.0 green:148.0 / 256.0 blue:208.0 / 256.0 alpha:1];
}
20
MikeS

InterfaceBuilderで割り当てられた画像を修正するには、次のコードを使用します。

- (void)fixImagesOfSegmentedControlForiOS7
{
    NSInteger deviceVersion = [[UIDevice currentDevice] systemVersion].integerValue;
    if(deviceVersion < 7) // If this is not an iOS 7 device, we do not need to perform these customizations.
        return;

    for(int i=0;i<toSegmentedControl.numberOfSegments;i++)
    {
        UIImage* img = [toSegmentedControl imageForSegmentAtIndex:i];
        UIImage* goodImg = [img imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        // clone image with different rendering mode
        [toSegmentedControl setImage:goodImg forSegmentAtIndex:i];
    }
}
13
cat

今日私はちょうどこの問題に出くわしました。私が更新に取り組んでいるアプリはかなり古く、xibファイルを使用しているため、これがストーリーボードで機能するかどうかわかりません。他の人が上で提案したように、iOS 6.1 SDKを使用する必要がありますが、これだけでは十分ではありません。次の手順を実行した後、古いUISegmentedControlの外観を取り戻すことができました。

  1. 問題のインターフェイスビルダードキュメントを開く
  2. ファイルインスペクタに移動します(最初のインスペクタタブ。ドキュメントアイコンがあります)。
  3. 「Interface Builder Document」セクションで、「Opens in」をXcode 4.6に変更します

これはバグだと思います。コードで作成されたUISegmentedControlインスタンスの回避策がなくても驚かないでしょう。これは、iOS 7のsegmentedControlStyleプロパティの廃止に多少関係していると思います( https://developer.Apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Classを参照)。 /DeprecationAppendix/AppendixADeprecatedAPI.html#//Apple_ref/occ/instp/UISegmentedControl/segmentedControlStyle )。

これが誰かを助けることを願っています。

5
ianthetechie

以前のバージョンのXCodeからiPhoneOS6.1.sdkファイルを保存し、同じパスでXcode 5に追加すると、6.1 SDKに対してアプリをビルドして、7で実行するとすべてが6のようになるようにします。 iOS7 SDKは、可能であればすべてをiOS7のようにするようiOSに指示します。基本的に、あなたはiOS6アプリを持っていますが、XCode 5でそれを構築しています。

2
ahwulf

UISegmentedControlセグメントのいずれかで画像を使用する場合、iOS 7でそれらを正しく設定するためにいくつかのコードを追加する必要があります。そうしないと、それらはテンプレート画像として使用され、選択されたセグメントはセグメントの背景の切り抜きになります。

IOS 7のUISegmentedControlは、特に指定がない限り、画像をレンダリングモードUIImageRenderingModeAlwaysTemplateであると解釈します。以前の動作を実現するには、iOS 7の各セグメントの画像で-[UIImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]を使用する必要がありました。

2
Ryan

次のいずれかを実行できます。

  • UIを変更する準備ができるまで、iOS7のアプリを更新しないでください。 iOS6 SDKに対してコンパイルされたアプリは、iOS7のiOS6互換モードで実行され、iOS6とまったく同じように見えます。
  • カスタムの背景、セパレーターなどの画像をセグメント化されたコントロールに適用して、iOS6での外観を模倣します。
0

私のアプリでは、Segmentedコントロールを "Bar"スタイルに設定しました。それは私のios7 iphone5(whoa、5、6、7)のios6スタイルでレンダリングします。ただし、セグメント内のテキストは切り取られ、ビューの幅に関係なく、3つのドット「...」が追加されます。そのため、ios7でのios6セグメント化されたコントロールのレンダリングは本当にバグが多いようです

0
user1169629

はい、自分でコントロールを作成し直すことができます。見た目も機能も似た偽のセグメント化されたコントロールを作成します。

0
SpaceDog

出来ますか?あんまり...

独自のカスタムセグメントコントロールを作成できます。

または、UIAppearanceプロキシを使用して、セグメント化されたコントロールを画像でカスタマイズすることもできますが、iOS 6のように見せることは、あなたの責任です。

0
Daniel