2010-07-10 10 views
26

Ich möchte den Ursprung von scrollView im Fensterkoordinatensystem abrufen. Zum Beispiel ist der scollView-Ursprung gegenwärtig (0,51). Im Fensterkoordinatensystem sollte es jedoch 51 + 44 (Höhe der Navigationsleiste) +20 (Höhe der Statusleiste) = 115 sein. Im Fensterkoordinatensystem sollte scrollView.frame.origin (0,115) sein. Ich habe mit convertPoint versucht: Methoden, aber manchmal (0,51) oder (0,0). Bitte stellen Sie eine Lösung dafür bereit. DankeKonvertieren eines UIView-Ausgangspunkts in sein Fenster-Koordinatensystem

+0

Swift Version unten –

Antwort

9

Ich versuchte mit TechZen-Lösung, aber ohne Erfolg. Anstatt den Ursprung von scrollView zu konvertieren, habe ich auf die UIWindow-Klassenreferenz von Apple Docs verwiesen und das endCenter der Tastatur in das Koordinatensystem meiner Ansicht konvertiert, indem ich diesen Code [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow] verwendet habe. Dieses Stück Code hat funktioniert und somit mein Problem gelöst. Allerdings bleibt die Frage, warum es nicht die richtige Koordinate von scrollView.origin.So, im Grunde habe ich einen Workaround durch Konvertieren Tastatur Endcenter statt scrollView.origin. Oh, und ich habe all diese Sachen gemacht, um die neue Höhe meiner scrollView zu berechnen, wenn die Tastatur auf dem Bildschirm erscheint. Also, wenn jemand eine Lösung für dieses Problem oder eine bessere Lösung hat, bitte lassen Sie uns alle wissen.

+1

habe keine Lösung>? Ich habe das gleiche Problem – Jasmeet

+0

Bessere Lösung: https://github.com/michaeltyson/TPKeyboardAvoiding – Hemang

47

Es klingt wie Sie nicht zwischen den richtigen Ansichten konvertieren. Ein Rahmen Sicht wird auf die Koordinaten es ist Superview, nicht seine eigenen internen Koordinaten, wenn Sie also die Herkunft der im Hinblick auf die Fensterkoordinaten zu konvertieren versuchten, würden Sie die Superview verwenden müssen:

[[self superview] convertPoint:self.frame.origin toView:theWindow]; 

jedoch Noch einfacher ist es, den Nullpunkt von der Ansicht selbst in das Fenster zu konvertieren. Die beiden Codeteile sind äquivalent und daher ist es nicht notwendig, den Ursprung überhaupt zu verwenden.

[self convertPoint:CGPointZero toView:theWindow]; 
+0

I versuchte dieses Code Stück Code in ViewDidLoad Methode, mit Selbst ersetzt durch self.view und theWindow ersetzt durch self.view.window, aber es gibt (0,0) als die Ausgabe – Nishit

+0

Ich würde überprüfen, dass die Fenstereigenschaft der Ansicht ist nicht Null. Es ist oft. – TechZen

+1

Danke für die Antwort. Wie man mit diesem Problem umgeht. Ich habe versucht, self.view.window mit [UIApplication sharedApplication] .keywindow zu ersetzen, aber ohne Erfolg. – Nishit

5

Beachten Sie, dass diese Funktionen nur funktionieren, nachdem der View-Controller die Subviews beendet hat. Also, wenn Sie wollen, dass, wenn Ansicht Lasten, können Sie viewDidLayoutSubviews/viewDidAppear verwenden, aber nicht in viewDidLoad/viewWillAppear etc ...

Dieser Code funktioniert für mich:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView]; 
} 
2

Swift 2.1:

In viewDidAppear Ihren Viewcontroller (sonst Elemente noch nicht geschichtet sind):

 var yourFrame = yourScrollView.convertRect(yourScrollView.frame, toView: self.view) 

     //PRINT THE WHOLE RECT 
     print(yourFrame) 

     //PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW: 
     print("X: \(yourFrame.origin.x) Y: \(yourFrame.origin.y) WIDTH: \(yourFrame.width) HEIGHT: \(yourFrame.height)") 
+4

In Swift 3: var yourFrame = yourScrollView.convertRect (yourScrollView.frame, zu: self.view) – Medhi