1. 程式人生 > >IOS開發之自定義UIActionSheet

IOS開發之自定義UIActionSheet

IOS開發中,經常會用到UIActionSheet,但是,預設的只能新增按鈕。如果能自定義的話,豈不是更好?上網搜了一下,都是隻有那一種程式碼,通過設定幾個按鈕來增加UIActionSheet的高度,不是很準確。今天研究了一下,然後做了一個可以自定義高度和控制元件的通用UIActionSheet,拿出來共享一下。

自定義UIActionSheet的思路就是寫一個繼承了UIActionSheet的類,然後重寫裡面的layoutSubviews函式。我寫的自定義的佈局就是在上方有一個navgationbar的區域,裡面有左右兩個按鈕和一個title。下方是一個自定義區域。效果如下圖(這個圖裡,自定義區域用了一個UIDatePicker):


自定義類的類名為CustomActionSheet。標頭檔案如下:

  1. #import <UIKit/UIKit.h>
  2. @interface CustomActionSheet : UIActionSheet  
  3. @property (nonatomic, retain) UIView *customView;  
  4. @property (nonatomic, retain) NSString *customTitle;  
  5. -(id)initWithViewHeight:(float)_height WithSheetTitle:(NSString *)_title;  
  6. @end  

說明一下:customView就是可以自定義的區域,使用我這個自定義的類時,只要拿到customView,然後向其中addSubview即可,非常方便。customTitle就是上邊欄的標題。這裡帶有一個初始化方法
  1. -(id)initWithViewHeight:(float)_height withSheetTitle:(NSString *)_title  
_title賦值給customTitle,_height就是自定義UIActionSheet中自定義區域的高度,對應上邊的圖,就是UIDatePicker所佔區域的高度,自定義區域寬為320,不需要設定.

然後是CustomActionSheet.m檔案,核心的程式碼就是重寫的layoutSubviews函式,程式碼如下:

  1. -(void)layoutSubviews{  
  2.     [super layoutSubviews];  
  3.     //
  4. //    CGRect newFrame = self.frame;
  5. ////    newFrame.origin.y = 459;
  6. //    newFrame.origin.y = 459 - customViewHeight - NavBarHeight;
  7. //    self.frame = newFrame;
  8.     UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, ViewHeight - customViewHeight -NavBarHeight, 320, NavBarHeight)];  
  9.     navBar.barStyle = UIBarStyleBlackOpaque;  
  10.     UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:self.customTitle];  
  11.     UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(docancel)];  
  12.     navItem.leftBarButtonItem = leftButton;  
  13.     UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"確定" style:UIBarButtonItemStyleDone target:self action:@selector(done)];  
  14.     navItem.rightBarButtonItem = rightButton;  
  15.     NSArray *array = [[NSArray alloc] initWithObjects:navItem, nil];  
  16.     [navBar setItems:array];  
  17.     [self.superview addSubview:navBar];  
  18.     [self.superview addSubview:self.customView];  
  19. }  

然後是點選按鈕後的兩個事件觸發函式,程式碼如下:
  1. - (void) done{  
  2.     [self dismissWithClickedButtonIndex:0 animated:YES];  
  3.     [self.delegate actionSheet:self clickedButtonAtIndex:0];  
  4. }  
  5. - (void) docancel{  
  6.     [self dismissWithClickedButtonIndex:1 animated:YES];  
  7.     [self.delegate actionSheet:self clickedButtonAtIndex:1];  
  8. }  

使用自定義控制元件的類,需要實現UIActionSheetDelegate協議。其中的函式:

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

做一些點選按鈕後的操作。buttonIndex值為0,是點選“確定”按鈕觸發,1則是點選“取消”按鈕後觸發的。

這裡我寫了一個小例子,就是上面第一個圖的內容,給出下載連結: