2010-07-10 15 views
26

Voglio ottenere l'origine di scrollView nel sistema di coordinate di finestra. Ad esempio, attualmente, l'origine di scollView è (0,51). Ma nel sistema di coordinate delle finestre dovrebbe essere 51 + 44 (altezza barra di navigazione) +20 (altezza barra di stato) = 115. Mezzi nel sistema di coordinate della finestra, scrollView.frame.origin deve essere (0,115). Ho provato con convertPoint: metodi ma ottenendo (0,51) o (0,0) a volte. Si prega di fornire una soluzione a questo. GrazieConvertire un punto di origine di UIView nel suo sistema di coordinate di finestra

+0

versione Swift basso –

risposta

9

Ho provato con la soluzione TechZen ma senza risultato. Invece di convertire l'origine di scrollView, ho fatto riferimento a Apple docs UIWindow class Reference e convertito l'endCenter della tastiera nel sistema di coordinate della mia vista usando questo codice [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]. Questo pezzo di codice ha funzionato e quindi risolto il mio problema. Tuttavia, rimane la domanda sul motivo per cui non fornisce le coordinate corrette di scrollView.origin.So, fondamentalmente ho trovato una soluzione alternativa convertendo tastiera endcenter invece di scrollView.origin. Oh, stavo facendo tutte queste cose per calcolare la nuova altezza della mia scrollView quando la tastiera appare sullo schermo. Quindi, se qualcuno ha una soluzione a questo problema o una soluzione migliore, per favore fateci sapere a tutti noi.

+1

hai qualche soluzione>? Ho lo stesso problema – Jasmeet

+0

Soluzione migliore: https://github.com/michaeltyson/TPKeyboardAvoiding – Hemang

47

Sembra che tu non ti converta tra le viste corrette. cornice di una vista è impostato le coordinate di è superview, non le sue coordinate interne, quindi se state tentando di convertire l'origine di una vista alle coordinate della finestra, si avrebbe bisogno di utilizzare il superview:

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

Tuttavia , è ancora più semplice convertire il punto zero dalla vista stessa alla finestra. Le due parti di codice sono equivalenti e quindi non è necessario utilizzare l'origine.

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

I ho provato questo codice pezzo di codice nel metodo viewDidLoad, con self sostituito da self.view e theWindow sostituito da self.view.window, ma sta dando (0,0) come output – Nishit

+0

Vorrei verificare che la proprietà della finestra della vista non è niente. Lo è spesso. – TechZen

+1

Grazie per la risposta. Come affrontare questo problema. Ho provato a sostituire self.view.window con [UIApplication sharedApplication] .keywindow ma inutilmente. – Nishit

5

Si noti che queste funzioni funzioneranno solo dopo che il controller della vista ha terminato la visualizzazione delle sottoview. Quindi, se volete che quando vista dei carichi, è possibile utilizzare viewDidLayoutSubviews/viewDidAppear, ma non in viewDidLoad/viewWillAppear ecc ...

Questo codice ha funzionato per me:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

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

Swift 2.1:

In viewDidAppear (altrimenti gli elementi non sono ancora a strati) del vostro ViewController:

 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, to: self.view) – Medhi

Problemi correlati