2012-01-08 5 views
2

iOS 5の外観プロキシを使用してレイヤーのプロパティを設定するコードをリファクタリングすることはできますか?外観のプロキシとレイヤー

_button.layer.cornerRadius = 5.0f; 
_button.layer.borderWidth = 1.0f; 
_button.layer.borderColor = [[UIColor blackColor] CGColor]; 
_button.layer.masksToBounds = YES; 
+0

私は現時点で間違った答えが正しいとマークしていると感じています:-) [Tiemeの答え](http://stackoverflow.com/a/8955194/2547229)は、バニラのUIButtonにはっきりとしています。しかし、[Sandy's answer](http://stackoverflow.com/a/23891904/2547229)に示されている簡単な方法でUIButtonを拡張することができれば、あなたの質問に求められる効果を達成することができます。 – Benjohn

答えて

2

いや.. Appleのは言う:

外観のカスタマイズをサポートするために、クラスが UIAppearanceContainerプロトコルと関連するアクセサメソッドに準拠しなければならないがUI_APPEARANCE_SELECTORで をマークする必要があります。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

そしてUIButtonはしていません。

EDIT: UIButtonには、UI_APPEARANCE_SELECTORでマークされたメソッドはありません。

+2

UIButtonは実際にAppearance Proxiesをサポートしていますが、実際には、2011年にWWDCで提供された「UIKitコントロールの外観のカスタマイズ」セッションでAppleが行ったデモでUIButtonが使用されているのが見えます。Link https://developer.apple。com/videos/wwdc/2011 /(約28分で表示) – Jarson

+0

オペレータは、UIButtonについてではなく、コントロールのビューのCALayerについて質問していませんか? –

+0

でも可能ですが、可能ではありません。 – Tieme

4

回答が間違っています。レイヤーのプロパティを設定することはできますが、ビューをサブクラス化してアクセサーを介してレイヤープロパティを公開する必要があります。説明するために

、私は質問、cornerRadiusからわずか1プロパティを使用します:

ステップ1: UIButtonのサブクラスを実装します。

#import <UIKit/UIKit.h> 

@interface MyRoundedCornerButton : UIButton 

@end 

ステップ2: UI_APPEARANCE_SELECTORでタグ付けされたプロパティを追加します。

#import <UIKit/UIKit.h> 

@interface MyRoundedCornerButton : UIButton 

@property (readwrite, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; 

@end 

ステップ3: 新しいクラスを実装します。

@implementation MyRoundedCornerButton 

- (void)setCornerRadius:(CGFloat)cornerRadius 
{ 
    self.layer.cornerRadius = cornerRadius; 
} 

@end 

ステップ4: 外観プロキシにコーナー半径を設定します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ... 
    [MyRoundedCornerButton appearance].cornerRadius = 10.0; 
    ... 
} 

ステップ5:次に IBで、(または[表示の作成を定義する場所)、にカスタムビュークラスを設定(またはのインスタンスインスタンス)MyRoundedCornerButton代わりにUIButtonを。

メモ: 私はアプリ全体で簡単に変更可能なグラデーションの背景を適用するためにこれを行っています。私の場合、すべてのView Controllerのルートビューはカスタムクラスを使用します。このカスタムクラスはCAGradientLayer+(Class)layerClassメソッドで提供します。次に、UI_APPEARANCE_SELECTORタグを使用して、下にあるグラデーションレイヤのプロパティcolorslocationsを公開します。アプリの初期化時に一度設定すると、アプリ全体がカスタマイズされます。色をユーザーに公開して、さまざまなコントロールの色を完全にカスタマイズできるようにすることもできます。

+0

ありがとう!それは 'MyRoundedCornerButton:UIButton'ではないでしょうか? – Benjohn

+0

別の無関係な提案 - コーナー半径のタイプに 'NSNumber'を使用すると、' User Defined Runtime Attributes'を使ってIBの外観デフォルトをオーバーライドすることもできます。 – Benjohn

+1

@Benjohn、あなたは正しいです、それはUIButtonでなければなりません(私は私の答えを更新します)。これらの値を設定するために 'User Defined Runtime Attributes'を使用することについていくつか警告があります(例えば、互いに影響を与える複数のUI_APPEARANCE_SELECTORメンバーがある場合など)。しかし、ほとんどの場合、それらの問題は発生しません。また、Swiftを使用する場合、 'UI_APPEARANCE_SELECTOR'アノテーションが不要になり、メンバーに' @ IBInspectable'を使って値を公開して、IBで簡単に編集できるようにすることができます。 –

関連する問題