iOS 5の外観プロキシを使用してレイヤーのプロパティを設定するコードをリファクタリングすることはできますか?外観のプロキシとレイヤー
_button.layer.cornerRadius = 5.0f;
_button.layer.borderWidth = 1.0f;
_button.layer.borderColor = [[UIColor blackColor] CGColor];
_button.layer.masksToBounds = YES;
iOS 5の外観プロキシを使用してレイヤーのプロパティを設定するコードをリファクタリングすることはできますか?外観のプロキシとレイヤー
_button.layer.cornerRadius = 5.0f;
_button.layer.borderWidth = 1.0f;
_button.layer.borderColor = [[UIColor blackColor] CGColor];
_button.layer.masksToBounds = YES;
いや.. Appleのは言う:
外観のカスタマイズをサポートするために、クラスが UIAppearanceContainerプロトコルと関連するアクセサメソッドに準拠しなければならないがUI_APPEARANCE_SELECTORで をマークする必要があります。
そしてUIButtonはしていません。
EDIT: UIButtonには、UI_APPEARANCE_SELECTORでマークされたメソッドはありません。
回答が間違っています。レイヤーのプロパティを設定することはできますが、ビューをサブクラス化してアクセサーを介してレイヤープロパティを公開する必要があります。説明するために
、私は質問、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
タグを使用して、下にあるグラデーションレイヤのプロパティcolors
とlocations
を公開します。アプリの初期化時に一度設定すると、アプリ全体がカスタマイズされます。色をユーザーに公開して、さまざまなコントロールの色を完全にカスタマイズできるようにすることもできます。
ありがとう!それは 'MyRoundedCornerButton:UIButton'ではないでしょうか? – Benjohn
別の無関係な提案 - コーナー半径のタイプに 'NSNumber'を使用すると、' User Defined Runtime Attributes'を使ってIBの外観デフォルトをオーバーライドすることもできます。 – Benjohn
@Benjohn、あなたは正しいです、それはUIButtonでなければなりません(私は私の答えを更新します)。これらの値を設定するために 'User Defined Runtime Attributes'を使用することについていくつか警告があります(例えば、互いに影響を与える複数のUI_APPEARANCE_SELECTORメンバーがある場合など)。しかし、ほとんどの場合、それらの問題は発生しません。また、Swiftを使用する場合、 'UI_APPEARANCE_SELECTOR'アノテーションが不要になり、メンバーに' @ IBInspectable'を使って値を公開して、IBで簡単に編集できるようにすることができます。 –
私は現時点で間違った答えが正しいとマークしていると感じています:-) [Tiemeの答え](http://stackoverflow.com/a/8955194/2547229)は、バニラのUIButtonにはっきりとしています。しかし、[Sandy's answer](http://stackoverflow.com/a/23891904/2547229)に示されている簡単な方法でUIButtonを拡張することができれば、あなたの質問に求められる効果を達成することができます。 – Benjohn