Zauważyłem w projekcie, że umieszczenie popover nad prawym elementem przycisku wydaje się być z prawej strony nie tak z jakiegoś powodu. Próbowałem zamiast tego użyć UIButton dla niestandardowego widoku, a następnie wyświetlając popover z tego przycisku, ale popover zdaje się ignorować showFromRect, jeśli faktycznie dostarczę mu wartość "wyśrodkowaną".UIPopover presentFromBarButton poza centrum
Kod za to jest dość prosta:
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"share"] style:UIBarButtonItemStylePlain target:self action:@selector(shareTap:)];
self.navigationItem.rightBarButtonItem = button;
}
- (void)shareTap:(UIBarButtonItem *)button {
self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]];
[self.popover presentPopoverFromBarButtonItem:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
Teraz, jeśli przełączyć się za pomocą przycisku wewnętrznego, jak wspomniano, widzę podobne zachowanie (zmiana koloru notatka więc obraz wyświetlany).
Kod do tego jest jeszcze dość prosta:
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *innerButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 22, 22)];
[innerButton setImage:[UIImage imageNamed:@"share"] forState:UIControlStateNormal];
[innerButton addTarget:self action:@selector(shareTap:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:innerButton];;
}
- (void)shareTap:(UIButton *)button {
self.popover = [[UIPopoverController alloc] initWithContentViewController:[[UIViewController alloc] init]];
// CGRect bottomCenter = CGRectMake(button.frame.size.width/2, button.frame.size.height, 1, 1);
CGRect bottomCenter = CGRectMake(2, button.frame.size.height, 1, 1);
[self.popover presentPopoverFromRect:bottomCenter inView:button permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
Uwaga tutaj, że zamiast korzystać z rzeczywistą, Użyłem dowolną wartość, 2. Jeżeli używam 1 lub 0, popover zostanie wyrównany do lewej. Wszystko większe niż jeden jest ponownie wyrównane do prawej.
Szukałem około trochę patrząc na podobne pytanie, ale nie wydaje się znaleźć kogoś z tym samym problemem. Każdy pomysł na temat tego, co to powoduje lub jak tego uniknąć, byłby bardzo doceniony. Jedyne, co mogłem zgadnąć, to fakt, że ze względu na bliskość krawędzi, Apple robi kilka voodoo pozycjonujących, by zmusić go do tego, by tego chciał. Problem polega na tym, że przycisk w prawym górnym rogu wydaje się być całkiem standardową pozycją rozwijaną.
Edytuj: Potwierdziłem, że to samo zachowanie występuje po długim naciśnięciu ikony "Nowa wiadomość" w macierzystej aplikacji Poczta.
Edycja 2: Udało mi się potwierdzić w Apple, że to jest problem. W jednej z nowszych wersji (nie pamiętam, który, jak sądzę, jeden z 9), zrobili to, więc możesz ustawić to ręcznie. Domyślne zachowanie jest nadal nieprawidłowe Wierzę (nie próbowałem tego przez jakiś czas), ale możesz użyć metody offset CGRect, aby działała poprawnie, gdybyś był tak pochłonięty.
Spróbuj UIBarButtonItem * Przycisk = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: target UIBarButtonSystemItemAction: działanie samodzielne: @selector (ShareTap :)]; – Nishant
Czy mógłbyś wytłumaczyć nieco więcej?Używanie elementu systemowego samemu nie naprawia rozmieszczenia przycisków, a w mojej edycji wspomniałem, że domyślne aplikacje również wystawiają problem (Mail), które prawdopodobnie używają ikon systemowych. – shortstuffsushi