Change Action sheet popover arrow in iOS8
17,583
Solution 1
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
Solution 2
Jageen's answer, in Swift:
popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
Solution 3
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
}
Related videos on Youtube
![TienLe](https://i.stack.imgur.com/IyAdD.jpg?s=256&g=1)
Comments
-
TienLe about 2 years
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:
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]; UIPopoverPresentationController *popover = alertController.popoverPresentationController; if (popover) { popover.sourceView = self.view; popover.sourceRect = self.view.bounds; popover.permittedArrowDirections = UIPopoverArrowDirectionUnknown; } [self presentViewController:alertController animated:YES completion:nil];
-
Alfa almost 10 years
-
Jageen almost 10 yearsuse [alertControllerActionSheet.popoverPresentationController setPermittedArrowDirections:0];
-
-
tuoxie007 over 9 yearsrect.orign.x = ... and .y == ... are not required.