UIButtonをサブクラス化しています。必要なのは、ボタンタイプをRoundRectに設定することです。
Button.h
@interface Button : UIButton {}
- (void)initialize;
@end
Button.m
@implementation Button
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initialize];
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self){
[self initialize];
}
return self;
}
- (void)initialize
{
self.titleLabel.font = [UIFont systemFontOfSize:20];
self.titleLabel.textColor = [UIColor redColor];
self.titleLabel.textAlignment = UITextAlignmentCenter;
//[UIButton buttonWithType:UIButtonTypeRoundedRect];
}
@end
ここで[UIButton buttonWithType:UIButtonTypeRoundedRect]
を試しましたが、機能しません。誰かがそれを機能させる方法を提案できますか?
以前の多くの投稿で、UIButtonのサブクラス化は推奨されないと言われていましたが、Developer'sDocsではサブクラス化しないことについては言及されていません。
CocoaBuilderのスレッドでの議論を見つけることができます IButtonをサブクラス化する方法? 特に buttonTypeを無視するJack Nuttingの提案 :
この方法では、buttonTypeが明示的に何にも設定されていないことに注意してください。これは、おそらくUIButtonTypeCustomであることを意味します。ドキュメントは実際にはそれを指定していないようですが、それは列挙型の0値であるため、おそらくそれが起こります(そして、それは観察可能な動作でもあるようです)
探しているものとは異なりますが、サブクラスにはまだbuttonWithTypeメソッドがあり、正常に機能することを忘れないでください。
buttonWithTypeは、サブクラスinitWithFrameを呼び出し、タイプを適切に設定します。
SubclassButton *myButton=[SubclassButton buttonWithType:UIButtonTypeRoundedRect];
UIButton
サブクラス*次のコードはSwift 3以降で機能します。
設計上、buttonType
サブクラスのUIButton
を設定することはできません。自動的にcustom
に設定されます。これは、開始点としてわかりやすい外観と動作が得られることを意味します。
ボタンの外観を設定するコードを再利用する場合は、サブクラス化せずにこれを行うことができます。 1つのアプローチは、UIButton
を作成して視覚的プロパティを設定するファクトリメソッドを提供することです。
extension UIButton {
static func createStandardButton() -> UIButton {
let button = UIButton(type: UIButtonType.system)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16)
button.setTitleColor(UIColor.black, for: .normal)
button.setTitleColor(UIColor.gray, for: .highlighted)
return button
}
}
let button = UIButton.createStandardButton()
他のカスタマイズ手法で十分な場合は、UIButton
のサブクラス化を避けます。ファクトリメソッドの例は1つのオプションです。 UIAppearanceAPIなどを含む他のオプションがあります。
サブクラス化を必要とするカスタマイズのニーズがある場合があります。たとえば、UIButton
サブクラスを作成して、タッチイベントに応じてボタンをアニメーション化する方法を細かく制御したり、タップしたときにボタンが事前定義されたデリゲートまたはクロージャを呼び出すようにしました(それぞれに#selector
を割り当てるのではありません)。インスタンス)。
以下は、出発点としての基本的なUIButton
サブクラスの例です。
internal class CustomButton: UIButton {
init() {
// The frame can be set outside of the initializer. Default to zero.
super.init(frame: CGRect.zero)
initialize()
}
required init?(coder aDecoder: NSCoder) {
// Called when instantiating from storyboard or nib
super.init(coder: aDecoder)
initialize()
}
func initialize() {
print("Execute common initialization code")
}
}
let button = CustomButton()
print(button.buttonType == .custom) // true
UIButtonType
に関するメモ2012年に質問があったため、UIButtonType.roundedRect
は非推奨になりました。ヘッダーファイルのコメントは、代わりにUIButtonType.system
を使用するように言っています。
以下は、XcodeでSwiftに変換されたUIButton.hからのものです
public enum UIButtonType : Int {
case custom // no button type
@available(iOS 7.0, *)
case system // standard system button
case detailDisclosure
case infoLight
case infoDark
case contactAdd
public static var roundedRect: UIButtonType { get } // Deprecated, use UIButtonTypeSystem instead
}
IOS7では、これは以前よりも関連性が高くなります。UIButtonTypeSystemを使用する場合はneedであり、単にinitをオーバーライドして[MyButton alloc] init]を実行することはできません。これは、UIButtonTypeCustomであるためです。 tintColorを反映せず、Niceハイライトフェード効果もありません。
サブクラス化するには、次のような静的コンストラクターを作成します。
+ (instancetype)myButtonWithTitle:(NSString *)title imageNamed:(NSString *)imageName target:(id)target action:(SEL)action {
MyButton *button = [self buttonWithType:UIButtonTypeSystem];
... my custom setup for title, image, target, etc ...
return button;
}
あなたは間違いなくUIButtonをサブクラス化することができます。 UITextFieldのように見えるDateButtonを正常に作成しましたが、ユーザーがそれに触れると、ポップオーバーにDatePickerが表示されます。日付などを保存するプロパティがあります。上記で問題が解決しない場合はお知らせください。詳細を投稿します。