Eylem sayfasına UIPickerView ve bir Düğme ekleyin - Nasıl?


120

Uygulamam, aşağıdaki şeylerin bir işlem sayfasına eklenmesini gerektiriyor.

  • UIToolbar
  • UIToolbar üzerindeki düğme
  • UIPicker Kontrolü

Gereksinimlerimi anlamak için bir resim ekledim.

alternatif metin

Bunun nasıl uygulanabileceğini açıklar mısınız?


3
Bu ilginç sorunu gönderdiğiniz için teşekkür ederiz!
Tuyen Nguyen

ActionSheet, pickerView, vb . Yönetimi ile uğraşmak yerine EAActionSheetPicker'ı kullanmanızı tavsiye ederim . Kodunuzu gerçekten çok temizler.
ebandersen

@eckyzero Maalesef, EAActionSheetPicker, iOS 7'de bozuk görünüyor, hepsi "geçersiz bağlam 0x0." ile başlayan birçok hata var.
Magnus

Tabii ki gerçek olmasının iyi olması ... beni
korkut,

EAActionSheetPicker artık çalışmıyor.
osxdirk

Yanıtlar:


25

İOS 7 güncellemesi

UIActionSheet için Apple belgeleri :UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

İOS 7'de ciddi geçersiz içerik hatalarına yol açabileceğinden, bir Eylem Sayfasının içeriğini özelleştirmeye çalışmamanızı öneririm. Bu sorun üzerinde birkaç saat çalıştım ve sonunda farklı bir yaklaşım benimsemeye karar verdim. Eylem sayfasını gösterme çağrısını basit bir tablo görünümü içeren bir modal görünüm denetleyicisiyle değiştirdim.

Bunu başarmanın birçok yolu var. İşte mevcut bir projede uyguladığım bir yol. Güzel çünkü tüm kullanıcıların bir seçenekler listesinden seçim yapabileceği 5 veya 6 farklı ekran arasında yeniden kullanabilirim.

  1. Yeni bir UITableViewController alt sınıfı oluşturun SimpleTableViewController.
  2. Film şeridinizde (bir gezinme denetleyicisine gömülü) bir UITableViewController oluşturun ve özel sınıfını SimpleTableViewController olarak ayarlayın.
  3. SimpleTableViewController için gezinme denetleyicisine "SimpleTableVC" için bir Storyboard Kimliği verin.
  4. SimpleTableViewController.h dosyasında, tablodaki verileri temsil edecek bir NSArray özelliği oluşturun.
  5. Ayrıca SimpleTableViewController.h içinde, SimpleTableViewControllerDelegategerekli bir yöntemle bir protokol itemSelectedatRow:ve delegate türü adı verilen zayıf bir özellik oluşturun id<SimpleTableViewControllerDelegate>. Seçimi bu şekilde üst denetleyiciye geri aktaracağız.
  6. SimpleTableViewController.m olarak, tableview veri kaynağını uygulamak ve arama yöntemleri temsilci itemSelectedatRow:içinde tableView:didSelectRowAtIndexPath:.

Bu yaklaşım, oldukça yeniden kullanılabilir olma ek avantajına sahiptir. Kullanmak için, ViewController.h dosyanıza SimpleTableViewController sınıfını içe aktarın, SimpleTableViewDelegate'e uyun ve itemSelectedAtRow:yöntemi uygulayın. Ardından, kipi açmak için yeni bir SimpleTableViewController örneğini oluşturun, tablo verilerini ayarlayın ve temsilci verin ve sunun.

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];

Basit bir örnek oluşturup github'da yayınladım .

Ayrıca, Eylem sayfasının CGContext'in geçersiz bağlam hatalarına neden olduğunu gösterme konusuna bakın .


2
Ahh iOS 7! Şimdiye kadar geliştirilen her şeyi mahvettin. :(
Sagar R. Kothari

@Kyle Yaklaşımınızın ne olduğunu söyleyerek cevabınızı genişletebilir misiniz? Teşekkürler
Daniel Sanchez

1
@DanielSanchez Alternatif bir öneri ve kod örneği ile güncellendi.
Kyle Clegg

3
Çok daha zarif bir çözüm IMHO, metin alanınızın giriş görünümünü UIPickerView'a ve aksesuarını UIToolbar'a ayarlamaktır. Bir örnek için QuickDialog projesine göz atabilirsiniz.
Steve Moser

111

Bir çözüm daha:

  • araç çubuğu yok, ancak bölümlere ayrılmış bir denetim (göz alıcı)

    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 ana pencere uyarısına yanıt vermeyebilir ve uygulama sona erer.
Mahesh Babu

UIPickerView'ı kullanmaya çalışıyorum ancak onu uygulamama entegre edemedim. UIPickerView'ün, eylemi MYViewController: UIViewController'da kayıtlı olan bir düğmeye tıklandığında görüntülenmesini istiyorum. Eylem yönteminde yukarıdaki pickerview kodunu koydum. başka ne yapmalıyım? Lütfen yardım et.
Namratha

1
Aslında fredrik, [[UIApplication sharedApplication] keyWindow] kullanmalısınız. Bunu değiştirmek için kaynak düzenlendi.
Eric Goldberg

3
Van Du Tran - (geçersiz) dismissActionSheet: (UISegmentedControl *) gönderen {UIActionSheet actionSheet = (UIActionSheet ) [gönderen denetimi]; [actionSheet dismissWithClickedButtonIndex: 0 animasyonlu: YES]; }
WINSergey

1
Dikkat: Bu, iOS 7'de birçok CGContext hatasına neden olur. Stackoverflow.com/questions/19129091/…
Kyle Clegg

75

Bu soru eski olsa da, bir ActionSheetPicker sınıfını bir kullanışlılık işleviyle bir araya getirdiğimi hızlı bir şekilde belirteceğim , böylece bir satırda UIPickerView ile bir ActionSheet oluşturabilirsin. Bu soruya verilen yanıtlardan alınan koda dayanmaktadır.

Düzenleme: Artık bir DatePicker ve DistancePicker kullanımını da destekliyor.


UPD:

Bu sürüm kullanımdan kaldırıldı: bunun yerine ActionSheetPicker-3.0'ı kullanın.

animasyon


1
Süper ... bunu uygulamamda kullanıyorum.
Michael Morrison

Muhteşem. Bunu şimdi kullanıyorum.
James Skidmore

İ kodunuzu sayesinde kullanırsanız projemde adınızı eklemem gerekir mi @Sick
vinothp

Merhaba, bu sınıfı uygulamamda kullanıyorum ve harika çalışıyor. Teşekkürler. Bir sorum var. In ActionSheetDatePickermodunda üstte araç çubuğuna birden düğmeler ekleyebilirsiniz. Bu sadece normal olanla ActionSheetStringPickerda mümkün müdür ?
Isuru

Çoklu seçim yapabilir mi?
Kyle Clegg

32

Evet! Sonunda buldum.

Soru resminde verildiği gibi işlem sayfasını açmak için düğme tıklama etkinliğinize aşağıdaki kodu uygulayın.

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)];

merhaba sagar, kod için teşekkürler, DatePickerDoneClick düğme etkinliği, nasıl teşekkür edeceğinizi
Apache

sagar, açılır eylem sayfası nasıl kapatılır ve metin alanına seçilen değer nasıl eklenir teşekkürler
Apache

[aac dimisswithclickedindex] // bu yöntem gibi bir şey. (bkz. İşlem sayfasına bir tamam düğmesi yerleştirdim ve tamamlanmış düğme hedefini ekledim - seçici ve seçici yerleştirme dimissal kodunu ekleyin.
Sagar R. Kothari

yanıt sagar için teşekkürler, ekledim [aac dismissWithClickedButtonIndex]; ancak uyarı alıyorum: 'UIActionSheet', '-dismissWithClickedButtonIndex'e yanıt vermeyebilir, ardından' DatePickerDoneClick 'seçicisi için aşağıdaki gibi yeni bir yöntem oluşturuyorum - (void) DatePickerDoneClick {NSLog (@ "Bitti tıklandı"); rating.text = pickerView objectAtIndex: row]} ne yapmalıyım, bu yüzden bitti düğmesine tıkladığımda UIActionSheet (aac) dismiss ve textfield (rating.text) seçiciden seçilen değerle doldurulsun teşekkürler sagar
Apache

1
@Spark, seçici metnini alma hakkında bir fikir vermek mümkün mü ..
Gönderiniz

10

Marcio'nun bu soruya mükemmel çözümü, bir UIActionSheet'e her türlü alt görüntüyü eklemede bana çok yardımcı oldu.

Bana (henüz) tamamen açık olmayan nedenlerden dolayı, UIActionSheet'in sınırları ancak görüntülendikten sonra belirlenebilir; hem sagar'ın hem de marcio'nun çözümleri bunu, gösterildikten sonra eylem sayfasına gönderilen bir setBounds: CGRectMake (...) mesajı ile başarılı bir şekilde ele alır .

Bununla birlikte, sayfa görüntülendikten sonra UIActionSheet sınırlarının ayarlanması, ActionSheet göründüğünde, görünüme "çıktığı" ve ardından yalnızca son 40 pikselin üzerinde kaydırıldığında atlamalı bir geçiş oluşturur.

Alt görünümleri ekledikten sonra bir UIPickerView boyutlandırırken, actionSheet'e gönderilen setBounds mesajını bir animasyon bloğu içinde sarmalamanızı öneririm. Bu, actionSheet'in girişini daha pürüzsüz hale getirecektir.

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
Bu harika bir ipucu. İos 4 ve sonraki sürümlerde, bu animasyon stili, dokümanlara göre "önerilmez". İOS 4 veya sonraki sürümlerinde, bunun yerine şunu deneyin: UIView animateWithDuration: 0.3f delay: 0 options: UIViewAnimationOptionCurveEaseInOut animasyonları: ^ {[actionSheet setBounds: CGRectMake (0,0,320,485)];} complete: NULL];
ceperry

9

DatePickerDoneClick işlevini bulmaya çalışan adamlar için ... İşte Eylem Sayfasını kapatmak için basit kod. Açıkçası aac bir ivar olmalıdır (uygulama .h dosyanızda yer alan)


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

9

Neden UIPickerViewa'nın içine girdiğini gerçekten anlamıyorum UIActionSheet. Bu, gelecekteki bir iOS sürümünde kırılabilecek dağınık ve hilekar bir çözüm gibi görünüyor. (Daha önce bir uygulamada UIPickerView, ilk dokunuşta sunulmayan ve yeniden çekilmesi gereken bir uygulamada böyle şeyler yaşadım - tuhaf tuhaflıklar UIActionSheet).

Yaptığım şey basitçe UIPickerViewa'yı uygulamak ve sonra onu benim görüşüme bir alt görünüm olarak eklemek ve sanki bir eylem sayfası gibi sunuluyormuş gibi yukarı doğru hareket ettirmek.

/// 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;
    }];
}

Bu harika teşekkürler. Bunun iOS 7 ile iyi çalıştığını buldunuz mu?
2013

1
Ekrana göre hareketlendirilen harika basit seçici görünümü için +1. Ama kodda bir hata var. Görünüm backgroundTapButton, seçici görünümünün üstünde ortaya çıkar ve burada, seçici görünümünün kullanıcı etkileşiminden engellenmesini sağlar. Yapmanız gereken, bu görünümü, seçici görünümün doldurmadığı kalan ekran alanına yapmaktı ... (istediğiniz gibi seçici görünümün arkasında bir görünüm oluşturamazsınız)
aZtraL-EnForceR

7

Marcio'nun müthiş çözümüne eklemek için dismissActionSheet:aşağıdaki gibi uygulanabilir.

  1. .H dosyanıza bir ActionSheet nesnesi ekleyin, onu sentezleyin ve .m dosyanızda referans verin.
  2. Bu yöntemi kodunuza ekleyin.

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

3

Bence bunu yapmanın en iyi yolu bu.

ActionSheetPicker-3.0

Hemen hemen herkesin önerdiği gibi, ancak hoş bir dokunuş olan bloklar kullanıyor!


Yukarıda okuduysanız, bu ActionSheetPicker sınıfının bu iş parçacığı nedeniyle ilk sırada ortaya çıktığını göreceksiniz. Yani evet, kabul edilen çözüm (¬_¬) sayesinde en iyi yol budur. stackoverflow.com/questions/1262574/…
OpenUserX03

2
Görünüşe göre apple, bu hata mesajını aldığım için eylem sayfalarının alt sınıflandırılmaması gerektiği kuralını uygulamaya başlamak üzere - "<Error>: CGContextSetFillColorWithColor: geçersiz bağlam 0x0. Bu ciddi bir hata. Bu uygulama veya kullandığı bir kitaplık , geçersiz bir bağlam kullanıyor ve bu nedenle sistem kararlılığının ve güvenilirliğinin genel olarak bozulmasına katkıda bulunuyor. Bu bildirim bir nezaketen: lütfen bu sorunu düzeltin. Gelecek bir güncellemede önemli bir hata olacak. "
Stuart P.

@StuartP. cevabımı gör
Kyle Clegg

2

İOS 8'den beri, yapamazsınız, çalışmaz çünkü Apple UIActionSheet,. Lütfen Apple Belgelerine bakın :

Alt Sınıflandırma Notları

UIActionSheet, alt sınıflara dahil edilmek veya onun hiyerarşiye görüşlerini eklemek gerekir . UIActionSheet API tarafından sağlanandan daha fazla özelleştirme içeren bir sayfa sunmanız gerekiyorsa, kendi sayfanızı oluşturabilir ve bunu presentViewController: animated: complete: ile modsal olarak sunabilirsiniz.


1

Wayfarer tarafından benimsenen yaklaşımı beğendim ve flexaddicted, ancak (aZtral gibi) backgroundTapButton'ın kullanıcı etkileşimine yanıt veren tek öğe olduğu için çalışmadığını fark ettim. Bu, alt görünümlerinin üçünü birden koymamı sağladı: _picker, _pickerToolbar ve backgroundTapButton, daha sonra ekranda ve ekran dışında canlandırılan kapsayıcı bir görünümün (açılır pencere) içine. _PickerToolbar'da bir İptal düğmesine de ihtiyacım vardı. Açılır pencere görünümüyle ilgili kod öğeleri aşağıda verilmiştir (kendi seçici veri kaynağınızı ve temsilci yöntemlerinizi sağlamanız gerekir).

#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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.