2010-07-10 13 views
26

Pencere koordinat sisteminde scrollView kaynağını almak istiyorum. Örneğin, şu anda, scollView kaynağı (0,51) 'dir. Ancak pencere koordinat sisteminde 51 + 44 (gezinti çubuğu yüksekliği) +20 (durum çubuğu yüksekliği) = 115 olmalıdır. Pencere koordinat sisteminde, scrollView.frame.origin (0,115) olmalıdır. ConvertPoint: yöntemlerini denedim ancak bazen (0,51) veya (0,0) aldım. Lütfen buna bir çözüm sunun. TeşekkürlerUIView başlangıç ​​noktasını kendi Pencere koordinat sistemine dönüştürün

+0

Swift versiyonu aşağı aşağıda –

cevap

9

TechZen çözümüyle çalıştım ama boşuna. ScrollView'ın kökeni dönüştürmek yerine, bu belgeyi [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow] kullanarak Apple docs UIWindow sınıf başvurusuna başvurdum ve klavyenin endCenter'ını görünümümün koordinat sistemine dönüştürdüm. Bu kod parçası çalıştı ve bu yüzden problemimi çözdü. Ancak, soru hala scrollView.origin.So düzgün bir koordinat vermez olarak kalır, temelde scrollView.origin yerine klavye endcenter dönüştürerek bir geçici çözüm var. Oh, ve ekranın üstünde klavye görüntülendiğinde, scrollView'un yeni yüksekliğini hesaplamak için bütün bu şeyleri yapıyordum. Yani, eğer birisi bu soruna bir çözüm veya daha iyi bir çözümü varsa, lütfen hepimizin bilmesini sağlayın.

+1

herhangi bir çözüm aldı>? Aynı sorun var – Jasmeet

+0

Daha iyi bir çözüm: https://github.com/michaeltyson/TPKeyboardAvoiding – Hemang

47

Doğru görünümler arasında dönüştürme yapmadığınız gibi geliyor. Ancak

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

: Bir görünümün çerçeve Eğer pencere koordinatlara bir görünüm kökenini dönüştürmek çalışıyormuş öyleyse, Superview kullanmanız gerekir, Superview değil kendi iç koordinatlar var koordinatlarına ayarlanır Sıfır noktasını, görünümden kendisini pencereye dönüştürmek daha da kolaydır. İki kod parçası eşdeğerdir ve bu nedenle menşei kullanmak kesinlikle gerekli değildir.

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

ben self.view ve theWindow tarafından self.view.window tarafından değiştirilen self ile değiştirilen viewDidLoad yönteminde bu kod parçasını denedim, ancak – Nishit

+0

çıktısını (0,0) olarak görüntülemenin pencere özelliğini kontrol ediyorum sıfır değil. Sık sık. – TechZen

+1

Yanıtladığınız için teşekkür ederiz. Bu problemle nasıl baş edilir. Self.view.window'u [UIApplication sharedApplication] .keywindow ile değiştirmeyi denedim ama boşuna. – Nishit

5

Bu işlevlerin yalnızca denetleyicinin alt görünümleri düzenlemeyi bitirdikten sonra çalışacağını unutmayın. Yani görünüm yükler, sen ancak, viewDidLayoutSubviews/viewDidAppear kullanabilirsiniz zaman bunu istiyorum değilse de viewDidLoad/viewWillAppear vs ...

Bu kod benim için çalıştı:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

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

Swift 2.1:

viewDidAppear yılında

(aksi elemanları katmanlı henüz değildir) kendi ViewController ait:

 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

Swift 3: da var yourFrame = yourScrollView.convertRect (sizinScrollView.frame, to: self.view) – Medhi

İlgili konular