작업 시트에 UIPickerView 및 버튼 추가-방법?


120

내 응용 프로그램은 작업 시트에 다음 항목을 추가해야합니다.

  • UIToolbar
  • UIToolbar의 버튼
  • UIPicker 컨트롤

내 요구 사항을 이해하기 위해 이미지를 포함했습니다.

대체 텍스트

이것이 어떻게 구현 될 수 있는지 설명해 주시겠습니까?


3
이 흥미로운 문제를 게시 해 주셔서 감사합니다!
Tuyen Nguyen 2011 년

대신 등을 관리하는 actionSheet, pickerView, 장난, 나는 사용하는 것이 좋습니다 것입니다 EAActionSheetPicker을 . 코드를 정말 많이 정리합니다.
ebandersen

@eckyzero 안타깝게도 EAActionSheetPicker는 iOS 7에서 손상된 것 같습니다. "잘못된 컨텍스트 0x0"으로 시작하는 많은 오류가 있습니다.
Magnus

물론 그것의 좋은에 사실 수 있습니다 ... 나를 푹, 그래서 어려운 B Y IOS
ChuckKelly

EAActionSheetPicker가 더 이상 작동하지 않습니다.
osxdirk 2017-06-25

답변:


25

iOS 7 업데이트

UIActionSheet에 대한 Apple 문서 :UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

iOS 7에서 심각한 잘못된 컨텍스트 오류가 발생할 수 있으므로 ActionSheet의 내용을 사용자 지정하지 않는 것이 좋습니다.이 문제를 해결하는 데 몇 시간을 보냈고 궁극적으로 다른 접근 방식을 사용하기로 결정했습니다. 액션 시트를 보여주는 호출을 간단한 테이블 뷰를 포함하는 모달 뷰 컨트롤러로 대체했습니다.

이를 수행하는 방법에는 여러 가지가 있습니다. 다음은 현재 프로젝트에서 방금 구현 한 한 가지 방법입니다. 모든 사용자가 옵션 목록에서 선택할 수있는 5 ~ 6 개의 다른 화면에서 재사용 할 수 있기 때문에 좋습니다.

  1. 새 UITableViewController 하위 클래스 인 SimpleTableViewController.
  2. 스토리 보드 (내비게이션 컨트롤러에 포함)에 UITableViewController를 만들고 해당 사용자 지정 클래스를 SimpleTableViewController로 설정합니다.
  3. SimpleTableViewController의 탐색 컨트롤러에 "SimpleTableVC"의 스토리 보드 ID를 제공합니다.
  4. SimpleTableViewController.h에서 테이블의 데이터를 나타내는 NSArray 속성을 만듭니다.
  5. 또한 SimpleTableViewController.h에서 SimpleTableViewControllerDelegate필요한 메소드 itemSelectedatRow:와 유형 위임이라는 약한 속성을 사용하여 프로토콜 을 만듭니다 id<SimpleTableViewControllerDelegate>. 이것이 선택을 부모 컨트롤러로 다시 전달하는 방법입니다.
  6. SimpleTableViewController.m에서의 tableview 데이터 소스를 구현하고 호출 방법을 위임 itemSelectedatRow:에서 tableView:didSelectRowAtIndexPath:.

이 접근 방식은 상당히 재사용 할 수 있다는 추가 이점이 있습니다. 사용하려면 ViewController.h에서 SimpleTableViewController 클래스를 가져오고 SimpleTableViewDelegate를 준수하고 itemSelectedAtRow:메서드를 구현합니다 . 그런 다음 모달을 열려면 새 SimpleTableViewController를 인스턴스화하고 테이블 데이터와 델리게이트를 설정 한 다음 제시하면됩니다.

UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];

간단한 예제를 만들어 github에 게시했습니다 .

또한 조치 시트 표시로 인해 CGContext 유효하지 않은 컨텍스트 오류가 발생 함을 참조하십시오 .


2
아 iOS 7! 당신은 지금까지 개발 된 모든 것을 망쳤습니다. :(
Sagar R. Kothari

@Kyle 귀하의 접근 방식이 무엇인지 말함으로써 답변을 확장 할 수 있습니까? 감사합니다
Daniel Sanchez

1
@DanielSanchez 대체 제안 및 코드 샘플로 업데이트되었습니다.
Kyle Clegg 2013 년

3
훨씬 더 우아한 솔루션 IMHO는 텍스트 필드의 입력보기를 UIPickerView로 설정하고 액세서리를 UIToolbar로 설정하는 것입니다. 예를 들어 QuickDialog 프로젝트를 확인할 수 있습니다.
Steve Moser 2014 년

111

또 하나의 솔루션 :

  • 툴바는 없지만 세그먼트 컨트롤 (eyecandy)

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil 
                                                        delegate:nil
                                                        cancelButtonTitle:nil
                                                        destructiveButtonTitle:nil
                                                        otherButtonTitles:nil];
    
    [actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
    
    CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
    
    UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
    pickerView.showsSelectionIndicator = YES;
    pickerView.dataSource = self;
    pickerView.delegate = self;
    
    [actionSheet addSubview:pickerView];
    [pickerView release];
    
    UISegmentedControl *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];
    closeButton.momentary = YES; 
    closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);
    closeButton.segmentedControlStyle = UISegmentedControlStyleBar;
    closeButton.tintColor = [UIColor blackColor];
    [closeButton addTarget:self action:@selector(dismissActionSheet:) forControlEvents:UIControlEventValueChanged];
    [actionSheet addSubview:closeButton];
    [closeButton release];
    
    [actionSheet showInView:[[UIApplication sharedApplication] keyWindow]];
    
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];

1
UIApplication이 mainwindow 경고에 응답하지 않고 응용 프로그램이 종료됩니다.
Mahesh Babu

UIPickerView를 사용하려고하는데 내 앱에 통합 할 수 없습니다. MYViewController : UIViewController에 작업이 등록 된 버튼을 클릭하면 UIPickerView가 표시되기를 원합니다. 액션 메소드에서 위의 pickerview 코드를 넣었습니다. 그 밖에 무엇을해야합니까? 도와주세요.
Namratha

1
사실 fredrik, [[UIApplication sharedApplication] keyWindow]를 사용해야합니다. 그것을 변경하기 위해 소스를 편집했습니다.
Eric Goldberg

3
Van Du Tran-(void) dismissActionSheet : (UISegmentedControl *) sender {UIActionSheet actionSheet = (UIActionSheet ) [발신자 수퍼 뷰]; [actionSheet dismissWithClickedButtonIndex : 0 animated : YES]; }
WINSergey

1
헤드 업 :이 아이폰 OS 7을 참조 많은 CGContext 오류가 발생 stackoverflow.com/questions/19129091/...
카일 클레

75

이 질문은 오래되었지만 편의 기능이 있는 ActionSheetPicker 클래스를 함께 던 졌으므로 UIPickerView가있는 ActionSheet를 한 줄에 생성 할 수 있음을 빠르게 언급하겠습니다 . 이 질문에 대한 답변의 코드를 기반으로합니다.

편집 : 이제 DatePicker 및 DistancePicker 사용도 지원합니다.


UPD :

이 버전은 더 이상 사용되지 않습니다. 대신 ActionSheetPicker-3.0을 사용 하세요 .

생기


1
슈퍼 ... 내 앱에서 사용합니다.
Michael Morrison

대박. 지금 이것을 사용하십시오.
제임스 스키드 모어

내가 코드, 덕분에 사용하는 경우 내 프로젝트에 이름을 추가해야 할 @Sick
vinothp

안녕하세요, 저는 제 앱에서이 클래스를 사용하고 있으며 훌륭하게 작동합니다. 감사. 질문이 있습니다. ActionSheetDatePicker모드 에서는 상단의 툴바에 여러 버튼을 추가 할 수 있습니다. 정상으로 ActionSheetStringPicker도 가능합니까?
ISURU

다중 선택이 가능합니까?
Kyle Clegg

32

네! 나는 마침내 그것을 찾습니다.

버튼 클릭 이벤트에 다음 코드를 구현하여 질문 이미지에 표시된대로 액션 시트를 팝업합니다.

UIActionSheet *aac = [[UIActionSheet alloc] initWithTitle:@"How many?"
                                             delegate:self
                                    cancelButtonTitle:nil
                               destructiveButtonTitle:nil
                                    otherButtonTitles:nil];

UIDatePicker *theDatePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 0.0, 0.0)];
if(IsDateSelected==YES)
{
    theDatePicker.datePickerMode = UIDatePickerModeDate;
    theDatePicker.maximumDate=[NSDate date];
}else {
    theDatePicker.datePickerMode = UIDatePickerModeTime;
}

self.dtpicker = theDatePicker;
[theDatePicker release];
[dtpicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged];

pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
pickerDateToolbar.barStyle = UIBarStyleBlackOpaque;
[pickerDateToolbar sizeToFit];

NSMutableArray *barItems = [[NSMutableArray alloc] init];

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
[barItems addObject:flexSpace];

UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(DatePickerDoneClick)];
[barItems addObject:doneBtn];

[pickerDateToolbar setItems:barItems animated:YES];

[aac addSubview:pickerDateToolbar];
[aac addSubview:dtpicker];
[aac showInView:self.view];
[aac setBounds:CGRectMake(0,0,320, 464)];

안녕 sagar, 코드 감사합니다, DatePickerDoneClick 버튼 이벤트, 감사 선언 방법
Apache

sagar, 팝업 액션 시트를 닫고 선택한 값을 텍스트 필드에 추가하는 방법 감사합니다
Apache

[aac dimisswithclickedindex] //이 메소드와 비슷합니다. (액션 시트에 완료 버튼을 배치하고 완료 버튼 대상 추가-선택기 및 선택기 위치 dimissal 코드를 참조하십시오.
Sagar R. Kothari

답장 sagar 주셔서 감사합니다, 나는 [aac dismissWithClickedButtonIndex]를 추가합니다; 하지만 경고가 표시됩니다. 'UIActionSheet'가 '-dismissWithClickedButtonIndex'에 응답하지 않을 수 있습니다. 그런 다음 아래와 같이 'DatePickerDoneClick'선택기에 대한 새 메서드를 만듭니다.-(void) DatePickerDoneClick {NSLog (@ "Done clicked"); ratings.text = pickerView objectAtIndex : row]} 무엇을해야하나요? 완료 버튼을 클릭하면 UIActionSheet (aac) dismiss 및 textfield (ratings.text)가 선택기에서 선택한 값으로 채워집니다. sagar
Apache

1
@Spark 게시물 + 1 .. 피커 텍스트 것에 대해 감사를 몇 가지 아이디어를 제공 할 수 있습니다
vinothp

10

이 질문에 대한 Marcio의 탁월한 솔루션은 UIActionSheet에 모든 종류의 하위보기를 추가하는 데 큰 도움이되었습니다.

(아직) 완전히 명확하지 않은 이유 때문에 UIActionSheet의 경계는 표시된 후에 만 ​​설정할 수 있습니다. sagar와 marcio의 솔루션 모두 setBounds : CGRectMake (...) 메시지 가 표시된 작업 시트로 전송되어이 문제를 성공적으로 해결합니다 .

그러나 시트가 표시된 후 UIActionSheet 경계를 설정하면 ActionSheet가 표시 될 때 불안정한 전환이 발생하여보기에 "팝"된 다음 최종 40 픽셀 정도만 스크롤됩니다.

하위보기를 추가 한 후 UIPickerView의 크기를 조정할 때 애니메이션 블록 내부의 actionSheet에 전송 된 setBounds 메시지를 래핑하는 것이 좋습니다. 그러면 actionSheet의 입구가 더 부드러워집니다.

UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];


// add one or more subviews to the UIActionSheet
// this could be a UIPickerView, or UISegmentedControl buttons, or any other 
// UIView.  Here, let's just assume it's already set up and is called 
// (UIView *)mySubView
[actionSheet addSubview:myView];

// show the actionSheet
[actionSheet showInView:[UIApplication mainWindow]];


// Size the actionSheet with smooth animation
    [UIView beginAnimations:nil context:nil];
    [actionSheet setBounds:CGRectMake(0, 0, 320, 485)];
    [UIView commitAnimations]; 

6
이것은 훌륭한 팁입니다. ios 4 이상에서는이 애니메이션 스타일이 문서에 따라 "권장"됩니다. iOS 4 이상에서는 대신 다음을 시도하십시오. UIView animateWithDuration : 0.3f delay : 0 options : UIViewAnimationOptionCurveEaseInOut animations : ^ {[actionSheet setBounds : CGRectMake (0,0,320,485)];} complete : NULL];
ceperry 2011

9

DatePickerDoneClick 함수를 찾기 위해 묶여있는 사람들을 위해 ... 여기에 Action Sheet를 닫는 간단한 코드가 있습니다. 분명히 aac는 ivar 여야합니다 (구현 .h 파일에있는 것).


- (void)DatePickerDoneClick:(id)sender{
    [aac dismissWithClickedButtonIndex:0 animated:YES];
}

9

나는 왜 UIPickerView내부에 들어가는 지 이해하지 못합니다 UIActionSheet. 이것은 지저분하고 엉뚱한 솔루션으로 보이며 향후 iOS 릴리스에서 깨질 수 있습니다. (이전에 앱에서이 브레이크와 같은 일이 있었는데 UIPickerView, 첫 번째 탭에서 표시되지 않았고 다시 탭해야했습니다 UIActionSheet.에서 이상한 단점 ).

내가 한 일은 단순히 a를 구현 한 UIPickerView다음 내 뷰에 하위 뷰로 추가하고 마치 액션 시트처럼 표시되는 것처럼 움직이는 애니메이션입니다.

/// Add the PickerView as a private variable
@interface EMYourClassName ()

@property (nonatomic, strong) UIPickerView *picker;
@property (nonatomic, strong) UIButton *backgroundTapButton;

@end

///
/// This is your action which will present the picker view
///
- (IBAction)showPickerView:(id)sender {

    // Uses the default UIPickerView frame.
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectZero];

    // Place the Pickerview off the bottom of the screen, in the middle set the datasource delegate and indicator
    _picker.center = CGPointMake([[UIScreen mainScreen] bounds].size.width / 2.0, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;

    // Create the toolbar and place it at -44, so it rests "above" the pickerview.
    // Borrowed from @Spark, thanks!
    UIToolbar *pickerDateToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, -44, 320, 44)];
    pickerDateToolbar.barStyle = UIBarStyleBlackTranslucent;
    [pickerDateToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];

    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The action can whatever you want, but it should dimiss the picker.
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
    [barItems addObject:doneBtn];

    [pickerDateToolbar setItems:barItems animated:YES];
    [_picker addSubview:pickerDateToolbar];

    // If you have a UITabBarController, you should add the picker as a subview of it
    // so it appears to go over the tabbar, not under it. Otherwise you can add it to 
    // self.view
    [self.tabBarController.view addSubview:_picker];

    // Animate it moving up
    [UIView animateWithDuration:.3 animations:^{
        [_picker setCenter:CGPointMake(160, [[UIScreen mainScreen] bounds].size.height - 148)]; //148 seems to put it in place just right.
    } completion:^(BOOL finished) {
        // When done, place an invisible button on the view behind the picker, so if the
        // user "taps to dismiss" the picker, it will go away. Good user experience!
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(backgroundTapped:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:_backgroundTapButton];
    }];

}

// And lastly, the method to hide the picker.  You should handle the picker changing
// in a method with UIControlEventValueChanged on the pickerview.
- (void)backgroundTapped:(id)sender {

    [UIView animateWithDuration:.3 animations:^{
        _picker.center = CGPointMake(160, [[UIScreen mainScreen] bounds].size.height + _picker.frame.size.height);
    } completion:^(BOOL finished) {
        [_picker removeFromSuperview];
        self.picker = nil;
        [self.backgroundTapButton removeFromSuperview];
        self.backgroundTapButton = nil;
    }];
}

정말 감사합니다. 이것이 iOS 7에서 잘 작동한다는 것을 알았습니까?
avance

1
+1은 화면에 애니메이션으로 표시되는 훌륭한 간단한 선택기보기입니다. 하지만 코드에 오류가 있습니다. view backgroundTapButton은 선택기보기 위에 생성되며 사용자 상호 작용에서 선택기보기를 차단합니다. 무엇 u는 정말 뜻하는 것은 피커 뷰가 이미 기입하지 않는 나머지 화면 공간이보기를 만드는 것이 었습니다 ... (당신이에 의미처럼 유 피커보기 뒤보기를 할 수 없습니다)
aZtraL - 집행자

7

marcio의 멋진 솔루션에 추가하려면 dismissActionSheet:다음과 같이 구현할 수 있습니다.

  1. ActionSheet 개체를 .h 파일에 추가하고 합성 한 다음 .m 파일에서 참조합니다.
  2. 이 메서드를 코드에 추가하십시오.

    - (void)dismissActionSheet:(id)sender{
      [_actionSheet dismissWithClickedButtonIndex:0 animated:YES];
      [_myButton setTitle:@"new title"]; //set to selected text if wanted
    }

3

이것이 최선의 방법이라고 생각합니다.

ActionSheetPicker-3.0

거의 모든 사람들이 제안하는 것이지만 블록을 사용하므로 좋은 터치입니다!


위에서 읽어 보면이 스레드로 인해이 ActionSheetPicker 클래스가 처음에 나온 것을 알 수 있습니다. 네, 이것이 가장 좋은 방법입니다. 수용된 솔루션 (¬_¬) 덕분입니다. stackoverflow.com/questions/1262574/…
OpenUserX03 2013 년

2
사과가이 오류 메시지가 표시되므로 작업 시트를 하위 클래스로 분류해서는 안된다는 규칙을 적용하려고하는 것 같습니다. "<Error> : CGContextSetFillColorWithColor : invalid context 0x0. 이것은 심각한 오류입니다.이 응용 프로그램 또는 사용하는 라이브러리입니다. ,이 (가) 잘못된 컨텍스트를 사용하고있어 시스템 안정성과 안정성이 전반적으로 저하되는 원인이됩니다.이 알림은 예의입니다.이 문제를 수정하십시오. 향후 업데이트에서 치명적인 오류가 될 것입니다. "
Stuart P.

@StuartP. 내 대답을 참조하십시오
Kyle Clegg

2

iOS 8 이후로는 할 수 없습니다 UIActionSheet. Apple이 . Apple 문서를 참조하십시오 :

서브 클래 싱 노트

UIActionSheet는 하위 클래스로 설계되지 않았으며 해당 계층에 뷰를 추가해서는 안됩니다 . UIActionSheet API에서 제공하는 것보다 더 많은 사용자 정의가 포함 된 시트를 표시해야하는 경우 직접 만들고 presentViewController : animated : completion :을 사용하여 모달로 표시 할 수 있습니다.


1

나는 Wayfarer가 취한 접근 방식을 좋아하고 flexaddicted했지만 backgroundTapButton이 사용자 상호 작용에 응답하는 유일한 요소이기 때문에 작동하지 않는다는 것을 (aZtral과 같은) 발견했습니다. 이로 인해 _picker, _pickerToolbar 및 backgroundTapButton의 세 가지 하위 뷰를 모두 포함 된 뷰 (팝업) 안에 넣은 다음 화면에서 애니메이션을 적용했습니다. _pickerToolbar에 취소 버튼도 필요했습니다. 다음은 팝업 뷰에 대한 관련 코드 요소입니다 (자신의 선택기 데이터 소스 및 위임 메서드를 제공해야 함).

#define DURATION            0.4
#define PICKERHEIGHT        162.0
#define TOOLBARHEIGHT       44.0

@interface ViewController ()
@property (nonatomic, strong) UIView        *popup;
@property (nonatomic, strong) UIPickerView  *picker;
@property (nonatomic, strong) UIToolbar     *pickerToolbar;
@property (nonatomic, strong) UIButton      *backgroundTapButton;
@end

-(void)viewDidLoad {
    // These are ivars for convenience
    rect = self.view.bounds;
    topNavHeight = self.navigationController.navigationBar.frame.size.height;
    bottomNavHeight = self.navigationController.toolbar.frame.size.height;
    navHeights = topNavHeight + bottomNavHeight;
}

-(void)showPickerView:(id)sender {
    [self createPicker];
    [self createToolbar];

    // create view container
    _popup = [[UIView alloc] initWithFrame:CGRectMake(0.0, topNavHeight, rect.size.width, rect.size.height - navHeights)];
    // Initially put the centre off the bottom of the screen
    _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    [_popup addSubview:_picker];
    [_popup insertSubview:_pickerToolbar aboveSubview:_picker];

    // Animate it moving up
    // This seems to work though I am not sure why I need to take off the topNavHeight
    CGFloat vertCentre = (_popup.frame.size.height - topNavHeight) / 2.0;

    [UIView animateWithDuration:DURATION animations:^{
        // move it to a new point in the middle of the screen
        [_popup setCenter:CGPointMake(rect.size.width / 2.0, vertCentre)];
    } completion:^(BOOL finished) {
        // When done, place an invisible 'button' on the view behind the picker,
        // so if the user "taps to dismiss" the picker, it will go away
        self.backgroundTapButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backgroundTapButton.frame = CGRectMake(0, 0, _popup.frame.size.width, _popup.frame.size.height);
        [_backgroundTapButton addTarget:self action:@selector(doneAction:) forControlEvents:UIControlEventTouchUpInside];
        [_popup insertSubview:_backgroundTapButton belowSubview:_picker];
        [self.view addSubview:_popup];
    }];
}

-(void)createPicker {
    // To use the default UIPickerView frame of 216px set frame to CGRectZero, but we want the 162px height one
    CGFloat     pickerStartY = rect.size.height - navHeights - PICKERHEIGHT;
    self.picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, pickerStartY, rect.size.width, PICKERHEIGHT)];
    _picker.dataSource = self;
    _picker.delegate = self;
    _picker.showsSelectionIndicator = YES;
    // Otherwise you can see the view underneath the picker
    _picker.backgroundColor = [UIColor whiteColor];
    _picker.alpha = 1.0f;
}

-(void)createToolbar {
    CGFloat     toolbarStartY = rect.size.height - navHeights - PICKERHEIGHT - TOOLBARHEIGHT;
    _pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, toolbarStartY, rect.size.width, TOOLBARHEIGHT)];
    [_pickerToolbar sizeToFit];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAction:)];
    [barItems addObject:cancelButton];

    // Flexible space to make the done button go on the right
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];

    // The done button
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)];
    [barItems addObject:doneButton];
    [_pickerToolbar setItems:barItems animated:YES];
}

// The method to process the picker, if we have hit done button
- (void)doneAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
    // Do something to process the returned value from your picker
}

// The method to process the picker, if we have hit cancel button
- (void)cancelAction:(id)sender {
    [UIView animateWithDuration:DURATION animations:^{
        _popup.center = CGPointMake(rect.size.width / 2.0, rect.size.height + _popup.frame.size.height / 2.0);
    } completion:^(BOOL finished) { [self destroyPopup]; }];
}

-(void)destroyPopup {
    [_picker removeFromSuperview];
    self.picker = nil;
    [_pickerToolbar removeFromSuperview];
    self.pickerToolbar = nil;
    [self.backgroundTapButton removeFromSuperview];
    self.backgroundTapButton = nil;
    [_popup removeFromSuperview];
    self.popup = nil;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.