Nach dem Zoom sind die Koordinaten durcheinander

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

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Nach dem Zoom sind die Koordinaten durcheinander

    Hallo,

    ich verzweifle gerade an einer App für das iPad, in der ich Objekte vom Typ UIViewController mit derm Finger verschiebe und auch zoomen möchte.

    Der Aufbau:
    Die Hauptview hat links einen View, aus dem ich die Sachen abholen kann und rechts einen View für die Ablage. Im rechten View ist ein Scrollview, damit ich den Bereich vergrößern kann.
    Mit einem UIPanGestureReconizer ziehe ich die Objekte von links nach rechts. Beim Ablegen erstelle ich ein neues Objekt (UIViewController) und füge es mit addSubView dem Scrollview hinzu. Das Objekt bekommt dann wieder einen UIPanGsetureRecognizer verpasst, damit ich anschließend im rechten Bereich weiter hin und herschieben kann.
    Das funktioniert.

    Mit einem UIPinchGestureRecognizer kann ich die Scrollview beliebig zoomen.

    Quellcode

    1. -(void)handlePinch:(UIPinchGestureRecognizer*)sender {
    2. sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
    3. sender.scale = 1;
    4. [dropzoneScroller setFrame:dropZoneRect];
    5. }

    Das funktioniert auch super!

    Wenn ich in den rechten Bereich hineinzoome und dann Objekte ablege, werden sie auch kleiner dargestellt und können weitergeschoben werden.
    Auch das geht wie gewünscht!

    Aber:
    Wenn ich nach dem Ablegen eines Objektes mit dem Pinch zoome, dann kann ich die Objekte teilweise nicht mehr weiterschieben oder meine Berechnungen (liegt ein Objekt auf einem anderen oder auf bestimmten Aktionsfeldern) gehen weit daneben.
    Eigentlich rechne ich alle Frames mit [scrollView convertRect:frame toView:rechteView] auf den rechten View um und das funktioniert auch, solange ich nicht erneut zoome.
    Zum Beispiel sind unten rechts Flächen, die bestimmte Aktionen auslösen. Lege ich ein Objekt ab und ziehe es anschließend nach unten, reagiert die Fläche, sobald das Objekt mit CGRectIntersectsRect eine Überlappung erkennt.
    Wenn ich vorher den Bereich kleiner zoome, dann reagieren die Flächen schon, wenn das Objekt noch weit darüber ist.

    Was mich dann noch sehr stutzig macht, ist die Tatsache, dass meine Objekte nach dem Hineinzoomen im Frame einen passenden Origin haben, aber die Size deutlich vergrößert ist.

    Kann mich da mal jemand auf die richtige Spur bringen?
  • Mac & i Test Abo
  • Wenn Du einen View transformierst, solltest Du frame nicht mehr verwenden:
    Warning: If the transform property is not the identity transform, the value of this property is undefined and therefore should be ignored.

    Du musst die innenliegenden Views immer bezüglich der bounds des skalierten Views berechnen.

    BTW: Warum verwendest Du hierfür keinen Scrollview?
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Du musst die innenliegenden Views immer bezüglich der bounds des skalierten Views berechnen.

    Das hört sich gut an. Leider kann ich es erst Montag testen...

    macmoonshine schrieb:

    BTW: Warum verwendest Du hierfür keinen Scrollview?

    Mach ich doch.
    Ich habe eine View, in der unten eine weitere View mit den Aktionsflächen liegt und der Rest wird von der Scrollview belegt, die ja auch gezoomt wird.
    Wegen der Aktionsflächen muss ich aber die Koordinaten umrechnen und nehme daher die darunter liegende View als Basis.
  • Sorry, ich komme leider erst heute dazu, dass Thema weiter zu verfolgen und hoffe, es hört mir noch jemand zu ;)

    Das Umrechnen der Koordinaten klappt insoweit, als dass ich den richtigen Origin aus den Bounds umrechnen lasse.

    Aber ich habe noch ein Problem mit der Size: Weil ich prüfen muss, ob die View bestimmte Bereiche überdeckt, verwende ich CGRectIntersectsRect, um Überlappungen zu entdecken.
    Ohne Zoomen geht das auch wunderbar, aber überraschenderweise (zumindest für mich !) verändert der UIPinchGestureRecognizer (der an der Scrollview hängt) auch die Size der darin enthaltenen Views und zwar so, dass sich beim Verkleinern der Scollview Breite und Höhe dieser Views vergrößern.
    Dadurch passen die anschließenden Berechnungen natürlich nicht mehr.

    Ich weiß auch gar nicht, gegen welche View ich hier mit convertRect umrechnen lassen könnte, damit das Maß wieder stimmt.
    Auch finde ich es seltsam, dass sich das Seitenverhältnis der Subviews ändert. Urprünglich sind sie 64 Pixel breit und 102 hoch, aber während des Zooms gleichen sich die Werte immer mehr an...

    Ich hoffe, ich habe mich verständlich ausgedrückt und bekomme eine ebensolche Antwort :rolleyes:
  • MCDan schrieb:

    Hatte ich weiter oben schon mal gefragt: Warum verwendest Du einen UIPinchGestureRecognizer und zoomst nicht über die UIScrollView Funktionalität?

    Ach so, ich hatte deine Frage so verstanden, warum ich keine ScrollView im Fenster habe. Damit zu zoomen, habe ich bisher nicht versucht, weil ich nicht daran gedacht habe ;)
    Ich lese mich da mal ein und probiere das.

    Aber kannst mir dennoch dieses merkwürdige Verhalten erklären?