Custom Segue und UIKit Dynamics

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Custom Segue und UIKit Dynamics

    Nabend,

    Direkt vor weg: Bitte steinigt mich nicht :D

    Ich habe mir von Stack overflow folgenden Custom Segue Code "stibitzt", aber leider klappt das nicht so recht.

    Quellcode

    1. ​@implementation CreateNewSpotSegue
    2. -(id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination {
    3. if (self = [super initWithIdentifier:identifier source:source destination:destination]) {
    4. UIViewController *src = self.sourceViewController;
    5. UIViewController *dest = self.destinationViewController;
    6. self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:src.view];
    7. [src addChildViewController:dest];
    8. [dest didMoveToParentViewController:src];
    9. dest.view.frame = CGRectMake(0, -src.view.bounds.size.height, src.view.bounds.size.width, src.view.bounds.size.height);
    10. [src.view addSubview:dest.view];
    11. }
    12. return self;
    13. }
    14. -(void)perform {
    15. UIGravityBehavior* gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[[self.destinationViewController view]]];
    16. UICollisionBehavior *collide = [[UICollisionBehavior alloc] initWithItems:@[[self.destinationViewController view]]];
    17. CGPoint left = CGPointMake(self.animator.referenceView.bounds.origin.x, self.animator.referenceView.bounds.origin.y + self.animator.referenceView.bounds.size.height);
    18. CGPoint right = CGPointMake(self.animator.refrenceView.bounds.origin.x + self.animator.referenceView.bounds.size.width, self.animator.referenceView.bounds.origin.y + self.animator.referenceView.bounds.size.height);
    19. [collide addBoundaryWithIdentifier:@"bottom" fromPoint:left toPoint:right];
    20. [collide setCollisionDelegate:self.sourceViewController];
    21. [self.animator addBehavior:gravityBehavior];
    22. [self.animator addBehavior:collide];
    23. }
    24. @end
    Alles anzeigen


    Mein Ziel war, auf Button Klick einen Modalen ViewController von unten reinspringen zu lassen. Leider passiert einfach nichts, obwohl beide Methoden aufgerufen werden.

    Ich muss ehrlich zugeben, ich kann gerade noch nicht all zu viel mit beiden Methoden anfangen, falls jemand Interesse hat kann ermir das hier mal gerne näher bringen...

    Verbunden sind die Controlelr so:
    Screenshot 2014-07-11 19.24.45.png
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Osxer schrieb:

    Ich kenn mich da ja gar nicht aus... aber bei Dynamics musste ich an folgendes Tutorial denken:
    iosdevelopertips.com/graphics/…avity-and-collisions.html
    Vielleicht hilft es dir ja in irgendwie... :)


    Hmm... grob überflogen eher weniger.

    Bin auch schon nen Schritt weiter.

    Hatte folgende Methoden im SourceViewControlelr zu implementieren:

    Quellcode

    1. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    2. self.dropSegue = (CreateNewSpotSegue *)segue;
    3. }
    4. -(void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier {
    5. NSLog(@"collision ended with %@", identifier);
    6. [self performSelector:@selector(setDropSegue:) withObject:nil afterDelay:1];
    7. }


    Nun habe ich leider dass problem, dass der Code genau verkehgrt herum arbeitet. Da fällt der View Controller von der Decke sozusagen...

    Nachtrag:
    Nun wird der Controller auf x:0 und y:0 eingeblendet und geht nach oben. Setze ich die y-Startposition auf die Höhe des Controllers passiert leider garnichts sichtbares...

    Quellcode

    1. ​-(id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination {
    2. if (self = [super initWithIdentifier:identifier source:source destination:destination]) {
    3. UIViewController *src = self.sourceViewController;
    4. UIViewController *dest = self.destinationViewController;
    5. self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:src.view];
    6. [src addChildViewController:dest];
    7. [dest didMoveToParentViewController:src];
    8. dest.view.frame = CGRectMake(0, 0, src.view.bounds.size.width, src.view.bounds.size.height);
    9. [src.view addSubview:dest.view];
    10. }
    11. return self;
    12. }
    13. -(void)perform {
    14. UIGravityBehavior* gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[[self.destinationViewController view]]];
    15. CGVector vector = CGVectorMake(0, -1.0);
    16. [gravityBehavior setGravityDirection:vector];
    17. UICollisionBehavior *collide = [[UICollisionBehavior alloc] initWithItems:@[[self.destinationViewController view]]];
    18. CGPoint left = CGPointMake(self.animator.refernceView.bounds.origin.x, self.animator.referenceView.bounds.origin.y + self.animator.referenceView.bounds.size.height);
    19. CGPoint right = CGPointMake(self.animator.referenceView.bounds.origin.x + self.animator.refrenceView.bounds.size.width, self.animator.referenceView.bounds.origin.y + self.animator.referenceView.bounds.size.height);
    20. [collide addBoundaryWithIdentifier:@"top" fromPoint:left toPoint:right];
    21. [collide setCollisionDelegate:self.sourceViewController];
    22. [self.animator addBehavior:gravityBehavior];
    23. [self.animator addBehavior:collide];
    24. }
    Alles anzeigen

    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DBocksteger ()

  • Immer noch nicht weiter...

    Hallo,

    leider bekomme ich es zum Teufel noch mal nicht hin :(

    Zur Veranschaulichung noch mal ein Bild:
    zielsetzung_1.jpg

    Der Modale View Controller soll also von unten herein springen und dann etwa auf höhe von einem dritten/viertel des Hauptviews stoppen und "snappen".

    Irgendjemand eine Idee was ich falsch mache?

    Eine weitere Frage die ich mir stelle... ich habe dem ModalViewController eine feste größe von 320x480 gegeben. Trotzdem wird er auf der gesamten iPhone 5 Display Größe dargestellt...
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • Wenn der View von unten "hereinfahren" soll, dann musst Du als Y-Startposition natürlich die Höhe bzw. MaxY vom aktuellen View verwenden, also

    Quellcode

    1. ​dest.view.frame = CGRectMake(0, src.view.bounds.size.height, dest.view.bounds.size.width, dest.view.bounds.size.height);

    Die Endposition ist dann:

    Quellcode

    1. CGRectMake(0, src.view.bounds.size.height - dest.view.bounds.size.height, dest.view.bounds.size.width, dest.view.bounds.size.height)​
  • MCDan schrieb:

    Wenn der View von unten "hereinfahren" soll, dann musst Du als Y-Startposition natürlich die Höhe bzw. MaxY vom aktuellen View verwenden, also

    Quellcode

    1. dest.view.frame = CGRectMake(0, src.view.bounds.size.height, dest.view.bounds.size.width, dest.view.bounds.size.height);

    Die Endposition ist dann:

    Quellcode

    1. CGRectMake(0, src.view.bounds.size.height - dest.view.bounds.size.height, dest.view.bounds.size.width, dest.view.bounds.size.height)


    Vielen Dank! :)
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io