IOS開發之自定義UIActionSheet
阿新 • • 發佈:2019-02-09
IOS開發中,經常會用到UIActionSheet,但是,預設的只能新增按鈕。如果能自定義的話,豈不是更好?上網搜了一下,都是隻有那一種程式碼,通過設定幾個按鈕來增加UIActionSheet的高度,不是很準確。今天研究了一下,然後做了一個可以自定義高度和控制元件的通用UIActionSheet,拿出來共享一下。
自定義UIActionSheet的思路就是寫一個繼承了UIActionSheet的類,然後重寫裡面的layoutSubviews函式。我寫的自定義的佈局就是在上方有一個navgationbar的區域,裡面有左右兩個按鈕和一個title。下方是一個自定義區域。效果如下圖(這個圖裡,自定義區域用了一個UIDatePicker):
自定義類的類名為CustomActionSheet。標頭檔案如下:
- #import <UIKit/UIKit.h>
- @interface CustomActionSheet : UIActionSheet
- @property (nonatomic, retain) UIView *customView;
- @property (nonatomic, retain) NSString *customTitle;
-
-(id)initWithViewHeight:(float)_height WithSheetTitle:(NSString *)_title;
- @end
說明一下:customView就是可以自定義的區域,使用我這個自定義的類時,只要拿到customView,然後向其中addSubview即可,非常方便。customTitle就是上邊欄的標題。這裡帶有一個初始化方法
- -(id)initWithViewHeight:(float)_height withSheetTitle:(NSString *)_title
然後是CustomActionSheet.m檔案,核心的程式碼就是重寫的layoutSubviews函式,程式碼如下:
- -(void)layoutSubviews{
- [super layoutSubviews];
- //
- // CGRect newFrame = self.frame;
- //// newFrame.origin.y = 459;
- // newFrame.origin.y = 459 - customViewHeight - NavBarHeight;
- // self.frame = newFrame;
- UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, ViewHeight - customViewHeight -NavBarHeight, 320, NavBarHeight)];
- navBar.barStyle = UIBarStyleBlackOpaque;
- UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:self.customTitle];
- UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(docancel)];
- navItem.leftBarButtonItem = leftButton;
- UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"確定" style:UIBarButtonItemStyleDone target:self action:@selector(done)];
- navItem.rightBarButtonItem = rightButton;
- NSArray *array = [[NSArray alloc] initWithObjects:navItem, nil];
- [navBar setItems:array];
- [self.superview addSubview:navBar];
- [self.superview addSubview:self.customView];
- }
然後是點選按鈕後的兩個事件觸發函式,程式碼如下:
- - (void) done{
- [self dismissWithClickedButtonIndex:0 animated:YES];
- [self.delegate actionSheet:self clickedButtonAtIndex:0];
- }
- - (void) docancel{
- [self dismissWithClickedButtonIndex:1 animated:YES];
- [self.delegate actionSheet:self clickedButtonAtIndex:1];
- }
使用自定義控制元件的類,需要實現UIActionSheetDelegate協議。其中的函式:
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
做一些點選按鈕後的操作。buttonIndex值為0,是點選“確定”按鈕觸發,1則是點選“取消”按鈕後觸發的。
這裡我寫了一個小例子,就是上面第一個圖的內容,給出下載連結: