IOS 7デバイス上のセグメント化されたコントロールをiOS 6バージョンのコントロールとして表示することは可能ですか?
インターフェースの再設計の準備ができていないので、新しいフラットコントロールが他のUIと連動しません。可能であれば、今のところiOS 6スタイルを維持することは間違いなく最善です。
明確にするために、私はiOS 6.1 Base SDKを使用してコンパイルしています。これが私の質問に対する「明白な」答えであることは承知していますが、機能しません。これを行うと、他のほとんどのUI要素がiOS 6のスタイルで表示されますが、UIAlertView
やUIActionSheet
と同様に、UISegmentedControl
は表示されません。ただし、UIAlertView
およびUIActionSheet
とは異なり、UISegmentedControls
は「システム」アイテムのように感じません。 iOS 6モードで表示できるはずです。
編集:私は最終的にこれを含む写真を含めると役立つと思いました(おそらく最初からこれを行うべきでした)。しかし、私が提供した答えは問題を解決しました。また、振り返ってみると、このように見えますmight結局のところiOS 6スタイルです。表示が間違っているため、iOS 7スタイルのように見えます。
私はすべての属性を手動で設定することによってこの問題を解決するのにかなり良い仕事をすることができましたが、それは完全ではありません。
これは私がやったことです:
- (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];
}
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];
}
}
今日私はちょうどこの問題に出くわしました。私が更新に取り組んでいるアプリはかなり古く、xibファイルを使用しているため、これがストーリーボードで機能するかどうかわかりません。他の人が上で提案したように、iOS 6.1 SDKを使用する必要がありますが、これだけでは十分ではありません。次の手順を実行した後、古いUISegmentedControl
の外観を取り戻すことができました。
これはバグだと思います。コードで作成されたUISegmentedControl
インスタンスの回避策がなくても驚かないでしょう。これは、iOS 7のsegmentedControlStyle
プロパティの廃止に多少関係していると思います( https://developer.Apple.com/library/ios/documentation/uikit/reference/UISegmentedControl_Classを参照)。 /DeprecationAppendix/AppendixADeprecatedAPI.html#//Apple_ref/occ/instp/UISegmentedControl/segmentedControlStyle )。
これが誰かを助けることを願っています。
以前のバージョンのXCodeからiPhoneOS6.1.sdkファイルを保存し、同じパスでXcode 5に追加すると、6.1 SDKに対してアプリをビルドして、7で実行するとすべてが6のようになるようにします。 iOS7 SDKは、可能であればすべてをiOS7のようにするようiOSに指示します。基本的に、あなたはiOS6アプリを持っていますが、XCode 5でそれを構築しています。
UISegmentedControlセグメントのいずれかで画像を使用する場合、iOS 7でそれらを正しく設定するためにいくつかのコードを追加する必要があります。そうしないと、それらはテンプレート画像として使用され、選択されたセグメントはセグメントの背景の切り抜きになります。
IOS 7のUISegmentedControlは、特に指定がない限り、画像をレンダリングモードUIImageRenderingModeAlwaysTemplateであると解釈します。以前の動作を実現するには、iOS 7の各セグメントの画像で-[UIImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]を使用する必要がありました。
次のいずれかを実行できます。
私のアプリでは、Segmentedコントロールを "Bar"スタイルに設定しました。それは私のios7 iphone5(whoa、5、6、7)のios6スタイルでレンダリングします。ただし、セグメント内のテキストは切り取られ、ビューの幅に関係なく、3つのドット「...」が追加されます。そのため、ios7でのios6セグメント化されたコントロールのレンダリングは本当にバグが多いようです
はい、自分でコントロールを作成し直すことができます。見た目も機能も似た偽のセグメント化されたコントロールを作成します。
出来ますか?あんまり...
独自のカスタムセグメントコントロールを作成できます。
または、UIAppearance
プロキシを使用して、セグメント化されたコントロールを画像でカスタマイズすることもできますが、iOS 6のように見せることは、あなたの責任です。