In was ich denke, ist eine ziemlich clevere Herangehensweise um das Problem des Startens eines Popover von einem UITableViewRowAction
zu lösen, möchte ich eine klare UIView
über die Zielaktion positionieren und sie für verwenden die sourceRect
zur Verankerung der UIPopoverPresentationController
. In diesem Fall ist die Zielaktion der orangefarbene "Acct" -Button, der im Screenshot unten gezeigt wird.Platzieren Sie eine UIView am Punkt des Tap, um Popover zu starten
Ich bin ein klare UIView
(self.clearTopView
) über den gesamten Tableview und ich init die Startansicht (tappedViewOverlay
) mit einem Rahmen mit dem von (so dachte ich) die Lage des Hahns (point
) in der Ansicht und eine CGSize
(tappedRectSize
). Dann füge ich es als Unteransicht zu self.clearTopView
hinzu. Ich färbe es gerade schwarz, damit ich es finden kann.
Wie im folgenden Screenshot gezeigt, funktioniert ein Teil des Schemas nach Plan. tappedViewOverlay
Ansicht hinzugefügt und entsprechend eingefärbt. Die popoverPresentationController
(thisPPC
) wird wie beabsichtigt von dieser Ansicht aus gestartet.
Problem ist, dass die Sicht immer in der oberen linken Ecke des Bildschirms positioniert ist, anstelle der gewünschten Position, die ist, wo das Leitungs auftrat. Hier ist der relevante Code:
else if ([[segue identifier] isEqualToString:@"AccountPopSegue"])
{
UITapGestureRecognizer *tapGestureRecognizer;
CGPoint point = [tapGestureRecognizer locationInView:self.clearTopView];
NSString *pointString = NSStringFromCGPoint(point);
NSLog(@"point is located at %@",pointString);
CGSize tappedRectSize= CGSizeMake(60,60);
CGRect tappedRect = {point,tappedRectSize};
NSString * tappedRectString = NSStringFromCGRect(tappedRect);
NSLog(@"tappedRect = %@",tappedRectString);
tappedViewOverlay = [[UIView alloc]initWithFrame:tappedRect];
tappedViewOverlay.backgroundColor = [UIColor blackColor];
[self.clearTopView addSubview:tappedViewOverlay];
[self.clearTopView setUserInteractionEnabled:NO];
NSString *tappedOverlayFrame = NSStringFromCGRect(tappedViewOverlay.frame);
NSLog(@"tappedViewOverlay.frame = %@",tappedOverlayFrame);
UIViewController *controller = segue.destinationViewController;
controller.popoverPresentationController.delegate = self;
controller.preferredContentSize = CGSizeMake(320, 186);
UIPopoverPresentationController *thisPPC = controller.popoverPresentationController;
thisNavController = (UINavigationController *)segue.destinationViewController;
AccountChangeVC *acCVC = (AccountChangeVC *)thisNavController.topViewController;
acCVC.delegate = self;
thisPPC.sourceView = self.clearTopView;
thisPPC.sourceRect = tappedViewOverlay.bounds;
Kann jemand bitte mir zeigen, wo ich falsch gehe?
bearbeiten
CoderWang wies ein Versehen in meinem Code aus, so habe ich es korrigiert:
else if ([[segue identifier] isEqualToString:@"AccountPopSegue"])
{
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc]init];
[self.clearTopView addGestureRecognizer:tapGestureRecognizer];
CGPoint point = [tapGestureRecognizer locationInView:self.clearTopView];
NSString *pointString = NSStringFromCGPoint(point);
NSLog(@"point is located at %@",pointString);
CGSize tappedRectSize= CGSizeMake(60,60);
CGRect tappedRect = {point,tappedRectSize};
NSString * tappedRectString = NSStringFromCGRect(tappedRect);
NSLog(@"tappedRect = %@",tappedRectString);
tappedViewOverlay = [[UIView alloc]initWithFrame:tappedRect];
tappedViewOverlay.backgroundColor = [UIColor blackColor];
[self.clearTopView addSubview:tappedViewOverlay];
[self.clearTopView setUserInteractionEnabled:NO];
NSString *tappedOverlayFrame = NSStringFromCGRect(tappedViewOverlay.frame);
NSLog(@"tappedViewOverlay.frame = %@",tappedOverlayFrame);
UIViewController *controller = segue.destinationViewController;
controller.popoverPresentationController.delegate = self;
controller.preferredContentSize = CGSizeMake(320, 186);
UIPopoverPresentationController *thisPPC = controller.popoverPresentationController;
thisNavController = (UINavigationController *)segue.destinationViewController;
AccountChangeVC *acCVC = (AccountChangeVC *)thisNavController.topViewController;
acCVC.delegate = self;
thisPPC.sourceView = self.clearTopView;
thisPPC.sourceRect = tappedViewOverlay.bounds;
Diese Änderung (Initialisierung des tapGestureRecognizer
und neben self.clearTopView
) eine leichte Veränderung der Position der schwarzen tappedViewOverlay
Ansicht. Sie können sehen, es hinter der „Zurück“ Taste NAV im folgenden Screenshot versteckt:
Soweit ich sagen kann, UITableViewRowAction Tasten haben keine Frame-Eigenschaft, zumindest nicht eine, die zugänglich ist ... – rattletrap99
Dann können Sie die verwandte Methode verwenden: - (CGPoint) convertPoint: (CGPoint) zeigen aufView: (nullable UIView *) anzeigen; mit CGPoint Punkt = [tapGestureRecognizer locationInView: self.clearTopView]; – CoderWang
Es wird besser sein, wenn Sie auch die Log-Infos angeben. – CoderWang