2010-08-01 13 views
9

Używam tego rodzaju metod i wyłączać, ale nigdy naprawdę rozumieć, w jaki sposób zachowywał.jaki sposób - (CGRect) convertRect: (CGRect) rect toview: (UIView *) prace widok

Za każdym razem staram się je wykorzystać, ja znajduję się grzebie w ciemności, staram inny aspekt i nigdy nie wydają się zrobić to, czego oczekuję go.

Dla argumentu, próbuję przekonwertować ramkę dostaję od powiadomienia UIKeyboard użytkownika.

W trybie poziomym, otrzymuję ten NSRect:

UIKeyboardFrameEndUserInfoKey = NSRect: {{406, 0}, {362, 1024}} 

Teraz chcę, aby przekształcić go do właściwego rect (swap x/y, szerokość i wysokość), więc robię

CGRect compatibleRect = [self convertRect:[[[notif userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] toView:nil]; 

ale rect staje:

compatibleRect = CGRect: {{406,406}, {362, 1024}} 

Każda pomoc będzie mile widziane :)

Odpowiedz

13

Używasz go źle. Zasadniczo dokonuje konwersji współrzędnych. Zakładam, że zaczyna się od konwersji rect od początkowego widoku do współrzędnych okna, a następnie konwersji z powrotem do współrzędnych okna do układu współrzędnych drugiego widoku. Oto przykład.

Masz dwa subviews w swoim oknie, jeden z ramką {{25,0}, {100, 100}}, drugi z ramką {{50, 50}, {200, 200}} Chcesz przetłumaczyć następującą wartość prostą {{50, 50}, {50, 50}} z pierwszego widoku podrzędnego na drugie. Oto, jak to może działać.

  1. konwertować rect od pierwszego subview na skoordynowane do okna współrzędne: Ponieważ subview rozpoczynamy od ma pochodzenie {25,0} musimy przełożyć je na współrzędne okna. Można to zrobić, dodając początek wydziału do początku rect, więc nowe współrzędne prostokąta w oknie wynoszą {{75, 50}, {50, 50}}

  2. przekonwertować nowy prostokąt z okna współrzędne współrzędnych drugiego podrzędnego: Zaczynamy od rect {{75, 50}, {50, 50}}, Ramka drugiego podglądu to {{50, 50}, {200, 200}}. Teraz odejmujemy pochodzenie drugiego podzbioru na rect, aby wykonać nasze tłumaczenie. Tak więc otrzymujemy przetłumaczony tekst {{25, 0}, {50, 50}}

+2

Rozumiem, jak działają konwersje. Jednak próbuję zrozumieć, jak działa ta konkretna metoda. Użyłem [self.window convertRect: [[[notif userInfo] objectForKey: UIKeyboardFrameEndUserInfoKey] CGRectValue] fromWindow: nil]; aby to zadziałało. Po przejrzeniu następującego linku http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/occ/instm/UIWindow/convertRect:fromWindow : Mówi o tym, jak się zachowuje, ale nie bardzo wiadomo, co naprawdę się dzieje. –

+4

W twoim przypadku chcesz użyć convertRect: fromView: not convertRect: toView: so [self convertRect: rect fromView: nil] przejmie granice , to jest na współrzędnych ekranu i przekonwertuj go na lokalne współrzędne widoku. – Elfred

Powiązane problemy