UIView auf UIScrollView ziehen - wie Position, Grösse und Zoom berechnen?

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

  • UIView auf UIScrollView ziehen - wie Position, Grösse und Zoom berechnen?

    Guten morgen!

    Das neue Forum sieht schick aus, habe geflattert.

    Ich entwickle ein Wortspiel für iOS.

    In der App habe ich ein UIScrollView mit einem UIImageView das ein Spielbrett-Bild enthält.

    Unter dem Spiel habe ich 7 UIViews die aufs UIScrollView gezogen werden sollen.

    Das UIScrollView kann man zoomen - mit double tap und pinch Gesten:

    [Blockierte Grafik: http://i.stack.imgur.com/2wjue.png]
    Das Ziehen von Spielsteinen habe ich mit hilfe von touchesMoved implementiert, in der Tile.m Datei.

    In der touchesEnded poste ich dann eine Notification, die vom ViewController.m aufgefangen wird:


    - (void) handleTileMoved:(NSNotification*)notification {
    Tile* tile = (Tile*)notification.object;

    if (tile.superview != _scrollView && CGRectIntersectsRect(tile.frame, _scrollView.frame)) {
    [tile removeFromSuperview];
    [_scrollView addSubview:tile];
    } else if (tile.superview == _scrollView && !CGRectIntersectsRect(tile.frame, _scrollView.frame)) {
    [tile removeFromSuperview];
    [self.view addSubview:tile];
    [self adjustFrames];
    }
    }


    Es funktioniert einigermassen, habe allerdings 2 Probleme:

    [Blockierte Grafik: http://i.stack.imgur.com/Hlp8a.png]
    Problem 1:

    Wie kann man denn die Position und Grösse eines neuplatzierten Spielsteins berechnen?

    Gibt es in iOS komfortable Funktionen dafür oder muss ich das mühsam aus contentOffset und zoomScale des UIScrollViews berechnen?

    Und wie soll ich am besten die Grösse eines Spielsteins setzen - seine frame mit CGMakeRect setzen oder

    tile.transform = CGAffineTransformMakeScale(newScale, newScale);

    aufrufen?

    Problem 2:

    Wenn ich UIImageView mit zwei Fingern oder Double-Tap zoome, wird nur das Spielbrett vergrössert und nicht die daraufliegende Spielsteine.

    Das liegt wahrscheinlich an der folgenden Funktion?

    - (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
    {
    return _imageView;
    }

    Wie kann ich das umgehen, kann ja oben nicht mehrere Objekte zurückgeben?

    Grüsse aus Bochum
    Alex


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

  • Du kannst für den ScrollView einfach einen "ContentView" verwenden, auf dem Du sowohl den ImageView mit dem Spielbrett als auch die Steine als Subviews platzierst. Wenn Du jetzt den ContentView zoomst, dann werden die Subviews entsprechend angepasst, wenn die Autosizing/Autolayout Einstellungen korrekt sind.
  • Ich habe nun ein _contView hinzugefügt - zwischen _scrollView and _imageView, wie man im angehängten Bild sieht.

    Das Zoomen mit DoppelßTap geht jetzt - die Spielsteine werden mitgezoomt.

    Dafür kann ich leider die _scrollView nicht mehr wischen - als ob die _imageView sämtliche Wischgesten maskieren würde.

    Habe die neue ViewController.m ebenso angehängt

    Gruss
    Alex
    Dateien