2016-07-20 18 views
2

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.

enter image description here

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:

enter image description here

Antwort

0

Problem ist, dass die ‚tappedRect‘ falsch ist, weiß nicht den Grund genau. Aber Sie können die folgende Methode versuchen rect für „Acct“ -Taste, um self.clearTopView umgewandelt zu bekommen:

CGRect tappedRect = [Acct.superview convertRect:acct.frame toView:self.clearTopView]; 

oder Fenster umgewandelt (wie self.clearTopView über die gesamte Tableview ist):

CGRect tappedRect = [Acct.superview convertRect:acct.frame toView:nil]; 
+0

Soweit ich sagen kann, UITableViewRowAction Tasten haben keine Frame-Eigenschaft, zumindest nicht eine, die zugänglich ist ... – rattletrap99

+0

Dann können Sie die verwandte Methode verwenden: - (CGPoint) convertPoint: (CGPoint) zeigen aufView: (nullable UIView *) anzeigen; mit CGPoint Punkt = [tapGestureRecognizer locationInView: self.clearTopView]; – CoderWang

+0

Es wird besser sein, wenn Sie auch die Log-Infos angeben. – CoderWang