このようなボタンでポップオーバーを作成するにはどうすればよいのでしょうか。
回答:
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: nil
delegate: self
cancelButtonTitle: nil
destructiveButtonTitle: nil
otherButtonTitles: @"Take Photo",
@"Choose Existing Photo", nil];
[actionSheet showFromRect: button.frame inView: button.superview animated: YES];
委任されたオブジェクトクラスのどこか...
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
// take photo...
}
else if (buttonIndex == 1) {
// choose existing photo...
}
}
これはUIActionSheet
です。 iPhoneでは、下からアニメーションします。 iPadではポップオーバーに表示されます。
ボタンを押すだけでこれを実行していると仮定します。
UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: nil
delegate: self
cancelButtonTitle: nil
destructiveButtonTitle: nil
otherButtonTitles: @"Take Photo",
@"Choose Existing Photo", nil];
[actionSheet showFromRect: button.frame inView: button.superview animated: YES];
IOS8 +では、新しいUIAlertController
クラスを使用する必要があります。
UIAlertController * alertController = [UIAlertController alertControllerWithTitle: nil
message: nil
preferredStyle: UIAlertControllerStyleActionSheet];
[alertController addAction: [UIAlertAction actionWithTitle: @"Take Photo" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
// Handle Take Photo here
}]];
[alertController addAction: [UIAlertAction actionWithTitle: @"Choose Existing Photo" style: UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
// Handle Choose Existing Photo here
}]];
alertController.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController * popover = alertController.popoverPresentationController;
popover.permittedArrowDirections = UIPopoverArrowDirectionUp;
popover.sourceView = sender;
popover.sourceRect = sender.bounds;
[self presentViewController: alertController animated: YES completion: nil];
またはSwiftで
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
alertController.addAction(UIAlertAction(title: "Take Photo", style: .Default, handler: { alertAction in
// Handle Take Photo here
}))
alertController.addAction(UIAlertAction(title: "Choose Existing Photo", style: .Default, handler: { alertAction in
// Handle Choose Existing Photo
}))
alertController.modalPresentationStyle = .Popover
let popover = alertController.popoverPresentationController!
popover.permittedArrowDirections = .Up
popover.sourceView = sender
popover.sourceRect = sender.bounds
presentViewController(alertController, animated: true, completion: nil)
他の応答と同様ですが、これは比較して非常に簡単に実装できます。
クラスでUIActionSheetDelegateを使用するようにします。
例:
@interface ExampleViewController : UIViewController <UIActionSheetDelegate>
次に、ExampleViewController.mm/mに追加します
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { //Get the name of the current pressed button
NSString *buttonTitle = [actionSheet buttonTitleAtIndex:buttonIndex];
if ([buttonTitle isEqualToString:@"Remove"]) {
NSLog(@"Remove this actionSheet"); }
if ([buttonTitle isEqualToString:@"Button 1"]) {
NSLog(@"Button 1 pressed"); }
if ([buttonTitle isEqualToString:@"Button 2"]) {
NSLog(@"Button 2 pressed"); }
if ([buttonTitle isEqualToString:@"Button 3"]) {
NSLog(@"Button 3 pressed"); }
if ([buttonTitle isEqualToString:@"Cancel"]) {
NSLog(@"Cancel clicked (anywhere away from it)"); } }
ボタンが押されたイベント、またはこれをポップアップする場所/タイミングで、次のように呼び出します。
- (IBAction)aButtonPressed:(id)sender {
NSString *actionSheetTitle = @"Action Sheet"; // Title
NSString *destroyTitle = @"Destroy"; // Button titles
NSString *button1 = @"Button 1";
NSString *button2 = @"Button 2";
NSString *button3 = @"Button 3";
NSString *cancelTitle = @"Cancel";
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:actionSheetTitle
delegate:self
cancelButtonTitle:cancelTitle
destructiveButtonTitle:destroyTitle
otherButtonTitles:button1, button2, button3, nil]; [actionSheet showInView:self.view];
}
そして、これに関する詳細情報@:http://developer.Apple.com/library/ios/#documentation/uikit/reference/UIActionSheet_Class/Reference/Reference.html =