2013-04-11 92 views
0

我正在嘗試創建一個自定義的UIButton。它有一個(變化的)圖像,一些信息文本,當然還有標題等更標準的東西。我正在使用界面構建器和故事板來完成我應用程序中的大部分設計工作。構建由其他UIViews組成的UIButton的正確方法是什麼?

建立一個像這樣的自定義UIButton的最佳做法是什麼?

我決定反對子類化,然後只是接管繪圖,因爲按鈕可以由更多標準元素構建而成。

相反,我試着繼承UIButton並構建和添加像UIImageView,UILabel等子視圖。這似乎很有用,但有一個例外,我不知道什麼時候放置所有東西,因爲邊界沒有在awakeFromNib中設置,initWithFrame也不會被調用。最後,我添加了另一個方法,我的UIViewController在viewDidAppear中調用。

然後我意識到也許我可以在沒有子類的情況下在UIViewController的viewDidLoad或viewDidAppear中構造按鈕,但我再次注意到按鈕上的邊界還沒有可用。

因此,這是最好的:

  1. 子類和繪圖一切
  2. 子類和建築由其他UIViews
  3. 在外部視圖
  4. 一些其他方法構建按鈕的組合物.. 。?

此外,在父母使用自動佈局時,似乎框架中的所有內容都會反對手工佈置子視圖,所以我認爲必須有更好的方法。

回答

1

創建一個單獨的UIView類並將其中的所有按鈕。
然後將該視圖子類化到您的視圖控制器。

像:

1)創建一個視圖與您的按鈕,並給該視圖的類名來定製的.xib,也給視圖。

即我創建一個名爲 「MultipleChoiceLayout」
按鈕一個自定義視圖 - MultipleChoiceLayout.h
- MultipleChoiceLayout.m
- MultipleChoiceLayout.xib

我定義MultipleChoiceLayout到的文件所有者,也是以自定義視圖。
enter image description here

2)添加該自定義視圖的父視圖

NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"MultiChoiceLayout" owner:self options:nil]; 

    MultiChoiceLayout *multipleChoiceLayout = [[MultipleChoiceLayout alloc] initWithArray:array]; 

    [ParentView addSubview:multipleChoiceLayout]; 

看看我是如何初始化在父視圖中的自定義視圖。

我將數組傳遞給「MultipleChoiceLayout」類,並在multichoicelayout類中定義自我。

-(id)initWithArray:(NSArray*)array 
    { 
    self = [array objectAtIndex:0]; 
    if(self) { 

    } 
    return self; 
} 
  • 現在發生什麼事是你是從父通過自我通過你定製的視圖對象從你的父母你的自定義視圖(見上面的代碼中)。現在,無論您何時點擊按鈕,它都會自動調用您在自定義視圖中定義的方法。你不必維護任何東西

希望這會有所幫助。

+0

感謝您的回覆。我遵循你的指示,但我無法調用[ParentView addSubview:...],因爲我正在使用故事板佈局父視圖。所以我試着把你的建議和這個結合起來:https://blog.compeople.eu/apps/?p=142它讓我非常滿意,除了現在我的加載的xib沒有正確地替換視圖。 – fixedpoint 2013-04-11 19:36:05

1

建立像這樣的自定義控件有一些常見的做法。在你的情況下,UIControl的子類會給你比標準UIView更大的靈活性,所以你不必爲按鈕交互創建自定義手勢。子類化UIButton總是會導致我的經驗頭痛。

另一個答案顯示,在單獨的xib中創建控件也是重用的好主意。通常建議讓UIControl子類設置它的組件(UIImageView等),而不是讓視圖控制器處理它。在這種情況下,如果從xib加載,控件將會收到類似initWithCoder:的消息,以便您可以正確設置子視圖。

至於使用自動佈局,如果應用程序的其餘部分使用它,那麼你的自定義控件也應該如此。永遠不要混合自動佈局和手動設置框架,事情會打破!

希望這可以回答你的一些問題。

+0

謝謝丹。我試着將你的一些方向與BaZinga結合起來,以及https://blog.compeople.eu/apps/?p=142中的一些提示。不幸的是,儘管現在我可以在xib中設計自定義控件,並將它們全部連接到相應的h和m文件中,但它在父視圖中無法正確顯示。我會把我的代碼放好。 – fixedpoint 2013-04-11 19:39:02

相關問題