Change Action sheet popover arrow in iOS8

后端 未结 4 1220
挽巷
挽巷 2021-02-07 01:13

i\'m using UIAlertController . But on iPad with iOS 8, actionSheet show with popover arrow. Any ideas to hide that arrow?

Here is my code:

         


        
相关标签:
4条回答
  • 2021-02-07 01:48

    You're on the wrong track using UIPopoverPresentationController to display an alert. You just do not need that snipped of code...

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"this is alert controller" message:@"yeah" preferredStyle:UIAlertControllerStyleActionSheet];
    
            UIAlertAction *cancelAction = [UIAlertAction
                                           actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel action")
                                           style:UIAlertActionStyleCancel
                                           handler:^(UIAlertAction *action)
                                           {
                                               NSLog(@"Cancel action");
                                           }];
    
            UIAlertAction *okAction = [UIAlertAction
                                       actionWithTitle:NSLocalizedString(@"OK", @"OK action")
                                       style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction *action)
                                       {
                                           NSLog(@"OK action");
                                       }];
    
            UIAlertAction *deleteAction = [UIAlertAction
                                           actionWithTitle:NSLocalizedString(@"Delete", @"Delete action")
                                           style:UIAlertActionStyleDestructive
                                           handler:^(UIAlertAction *action) {
                                               NSLog(@"Delete action");
                                           }];
    
            [alertController addAction:cancelAction];
            [alertController addAction:okAction];
            [alertController addAction:deleteAction];
    
           [self presentViewController:alertController animated:YES completion:nil];
    
    0 讨论(0)
  • 2021-02-07 01:54

    Solution :
    use below line for remove arrow from action sheet

    [yourAlertController.popoverPresentationController setPermittedArrowDirections:0];
    


    Sample

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Test Action Sheet" message:@"Message" preferredStyle:UIAlertControllerStyleActionSheet];
    
        UIAlertAction *cancelAction = [UIAlertAction
                                       actionWithTitle:@"Cancel"
                                       style:UIAlertActionStyleDestructive
                                       handler:^(UIAlertAction *action)
                                       {
                                           NSLog(@"Cancel action");
                                       }];
    
        UIAlertAction *okAction = [UIAlertAction
                                   actionWithTitle:@"Ok"
                                   style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction *action)
                                   {
                                       NSLog(@"OK action");
                                   }];
        UIAlertAction *otherAction = [UIAlertAction
                                   actionWithTitle:@"Other"
                                   style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction *action)
                                   {
                                       NSLog(@"Otheraction");
                                   }];
    
        [alertController addAction:okAction];
        [alertController addAction:otherAction];
        [alertController addAction:cancelAction];
    
    
        // Remove arrow from action sheet.
        [alertController.popoverPresentationController setPermittedArrowDirections:0];
    
        //For set action sheet to middle of view.
        alertController.popoverPresentationController.sourceView = self.view;
        alertController.popoverPresentationController.sourceRect = self.view.bounds;
    
        [self presentViewController:alertController animated:YES completion:nil];
    

    Output

    enter image description here

    0 讨论(0)
  • 2021-02-07 01:57

    The selected answer does not center the alert if you have a nav/status bar. To exactly center your alert controller:

    alertController.popoverPresentationController.sourceRect = [self sourceRectForCenteredAlertController];
    alertController.popoverPresentationController.sourceView = self.view;
    alertController.popoverPresentationController.permittedArrowDirections = 0;
    

    With the convenience method:

    - (CGRect)sourceRectForCenteredAlertController
    {
        CGRect sourceRect = CGRectZero;
        sourceRect.origin.x = CGRectGetMidX(self.view.bounds)-self.view.frame.origin.x/2.0;
        sourceRect.origin.y = CGRectGetMidY(self.view.bounds)-self.view.frame.origin.y/2.0;
        return sourceRect;
    }
    

    Also, the alert controller does not stay centered if the view is rotated. To keep the alert controller centered you need to update the sourceRect after rotation. For example:

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
    {
        // Check if your alert controller is still being presented
        if (alertController.presentingViewController) {
            alertController.popoverPresentationController.sourceRect = [self sourceRectForCenteredAlertController];
        }
    }
    

    Or, if you do not want to use rotation events, you can use the popoverPresentationController delegate method to reposition the popover:

    - (void)popoverPresentationController:(UIPopoverPresentationController *)popoverPresentationController willRepositionPopoverToRect:(inout CGRect *)rect inView:(inout UIView *__autoreleasing  _Nonnull *)view
    { 
        // Re-center with new rect
    }
    
    0 讨论(0)
  • 2021-02-07 02:05

    Jageen's answer, in Swift:

    popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
    
    0 讨论(0)
提交回复
热议问题