Odpowiedz na ten temat
Pokaż wyniki od 1 do 7 z 7
  1. Avatar _krzysiek
    Dołączył
    May 2007
    Skąd
    Łódź
    Postów
    1,939

    Cytuj | #1

    Cześć,

    jak doskonale większość z nas wie, możemy nasłuchiwać powiadomień (NSNotification) i otrzymać wiadomość kiedy zostanie wyświetlona/schowana klawiatura, bądź otrzymywać z delegate naszych pól tekstowych analogiczne metody i zareagować na to w odpowiedni sposób, albo zmieniając rozmiar widoku, albo przemieszczając określone pola wyżej, jeżeli jest to konieczne.

    Jednak, zastanawiam się, czy ktoś widział, zrobił, a może jestem ślepy i jest ona pod ręką, ale z dokumentacji jakoś tego nie mogłem wyczytać, gotową implementację kontrolera widoku, która automatycznie zmniejszy rozmiar widoku (self.view), tak aby nic nie wyświetlało się pod klawiaturą?

    Jeżeli widok zostanie zmniejszony, to jakikolwiek podwidok, który zostanie na niego nałożony i będzie miał ustawiony na sztywno trzymanie się dolnej krawędzi, powinien wtedy być widoczny na dole ekranu, a jak klawiatura się pojawi podskoczy do góry, i będzie w takiej samej odległości od krawędzi klawiatury, jak był wtedy od krawędzi ekranu.

    Mogłoby się wydawać, że tego typu implementacja jest bardzo prosta, ale jeżeli bliżej usiądziemy do problemu, zobaczymy wiele innych zgrzytów, które mogą wystąpić, np:
    - autorotacja interfejsu - inny rozmiar klawiatury dla landscape/portrait
    - różne urządzenia - iPhone/iPad
    - różne dolne belki - np. TabBar i już mamy inne rozmiary.

    Chodzi mi o dokładnie takie samo zachowanie, jakie ma w sobie UITableViewController - jeżeli w komórce (albo w headerze/footerze) znajdzie się pole tekstowe, automatycznie tabela jest zmniejsza wraz z pojawianiem się klawiatury. I dzieje się to idealnie, jeżeli na dole jest TabBar, zmniejszanie tabeli rozpoczyna się po jakimś 0.1s - dopóki jak klawiatura wysunęła się już ponad TabBar.
    Analogicznie takie samo zachowanie wprowadza UIWebView.

    W przypadku powyższych oba widoku mają pasek przewijania, ale jest to nie istotne. Chciałbym, aby zwykły UIView w kontolerze widoku został tak samo zmniejszony jak tabela, czy www w powyższych przykładach, a jeżeli będę chciał mieć skrolla to go umieszcze na widoku.

    Pozdrawiam
    Krzysztof
    WWW: http://appogeum.com
    appogeum.com


  2. Avatar Tuszy
    Dołączył
    Jun 2010
    Skąd
    Piaseczno
    Postów
    4

    Cytuj | #2

    Zachowanie UITableViewController'a które opisałeś, jest o tyle prostsze, że UITableView jest subklasą UIScrollView, więc zmiejszając frame ScrollView, nie zmieniamy tego co jest "w środku", więc można spkojnie tym manipulować. Sytuacja jest inna w przypadku zwykłego UIView, bowiem jak zmiejszymy frame, to obiekty które po operacji będą leżeć poza nim, nie będą widoczne.

    Jeżeli chcesz zmiejszyć widok, będziesz musiał zmienić frame widoku View Controllera, plus przesunąć do góry wszystkie te obiekty które byłyby zakryte przez klawiaturę poprzez sprawdzenie czy ich frame nie zahacza o klawiaturę. Można to zrobić za pomocą pętli for i sprawdzić frame'y za pomocą funkcji CGRectIntersectsRect(CGRect rect1, CGRect rect2) i przesunąć do góry. Nie wiem jakie wymiary mają poszczególne klawiatury dla iPhone'a i iPad'a, ale można to sprawdzić, i przy każdym wywołaniu metody sprawdzać na jakim urządzeniu jest odpalona aplikacja i pobierać odpowiednią wysokość do przesunięcia obiektów.

    Jeżeli chodzi o rotację, to możesz albo zostawić UIViewController'owi ustawiając odpowiednie autoresizing mask w widokach, albo samemu to zrobić odbierając NSNotifications i samodzielnie rotując wszystkie obiekty. Dzięki Core Animation, nie będzie to takie trudne, bo w iOS'ie wszystkie widoki mają już CALayer'y, więc wystarczy danej warstwie nadać odpowiednią translację.

    Pozdrawiam
    Komputer: MacBook white
    Telefon: iphone 4
    Odtwarzacz: iphone 4

  3. Avatar _krzysiek
    Dołączył
    May 2007
    Skąd
    Łódź
    Postów
    1,939

    Cytuj | #3

    Tuszy, mam dosyć bogate doświadczenie w developerce i właśnie chodzi o to, że jestem w pełni świadomy wszystkiego co napisałeś.

    Tak samo jak Ty, nie znam na pamięć wymiarów klawiatury iPada (iphone już wszedł w krew) i nie chce się tego uczyć na pamięć, chce, żeby te wartości były automatycznie wstawiane za mnie, jednocześnie mając na uwadze, fakt, że kontroler widoku może być wstawiony jako jedna z zakładek i posiadać na dole standardowy (lub niestandardowy o innych wymiarach) toolbar.

    "Sytuacja jest inna w przypadku zwykłego UIView, bowiem jak zmiejszymy frame, to obiekty które po operacji będą leżeć poza nim, nie będą widoczne."
    Właśnie, że nie, jeżeli ustalisz, że mają trzymać się dolnego marginesu, to zmieniając wysokość widoku, zmieniają te elementy swoje położenie idąc odpowiednio w górę, cały czas będąc w tej samej odległości od marginesu (Autoresizing mask).

    I właśnie chodzi o to, żeby nic nie robić samodzielnie, ustawiając co gdzie ma się znaleźć po rotacji czy wyświetleniu klawiatury, a żeby pozwolić mu ten proces w całości zautomatyzować.

    Mówiąc najprostszymi słowami, chciałbym klasę, która robi z UIView dokładnie to samo, co UITableViewController ze swoją tabelą - intersuje mnie tylko frame tej tabeli, a nie ilość jej komórek/sekcji, czy łatwiej mówiąc contentSize.
    WWW: http://appogeum.com
    appogeum.com

  4. Avatar Tuszy
    Dołączył
    Jun 2010
    Skąd
    Piaseczno
    Postów
    4

    Cytuj | #4

    Tuszy, mam dosyć bogate doświadczenie w developerce i właśnie chodzi o to, że jestem w pełni świadomy wszystkiego co napisałeś.
    Rozumiem, przepraszam jeśli Cię uraziłem.

    Właśnie, że nie, jeżeli ustalisz, że mają trzymać się dolnego marginesu, to zmieniając wysokość widoku, zmieniają te elementy swoje położenie idąc odpowiednio w górę, cały czas będąc w tej samej odległości od marginesu (Autoresizing mask).
    Owszem, zgadzam się z Tobą, opisywałem sytuację bez zastosowania Autoresizing mask.


    Mówiąc najprostszymi słowami, chciałbym klasę, która robi z UIView dokładnie to samo, co UITableViewController ze swoją tabelą - intersuje mnie tylko frame tej tabeli, a nie ilość jej komórek/sekcji, czy łatwiej mówiąc contentSize.
    Hmm.. nie wiem czy o tym wcześniej przypadkiem nie pisałeś w swoim pierwszym poście, ale zawsze można całość umieścić po prostu w UIScrollView, zabronić user'owi scrollowania, kiedy otrzymamy informację że klawiatura się pojawiła, zmienić frame, ustawić scrollEnabled na tak. Przy operacjach wziąć poprawkę na ewentualny TabBar lub Toolbar.
    Komputer: MacBook white
    Telefon: iphone 4
    Odtwarzacz: iphone 4

  5. Avatar wezuwiusz
    Dołączył
    Feb 2008
    Skąd
    Dublin, Katowice
    Postów
    783

    Cytuj | #5

    1 nie musisz sie uczyc na pamiec wielkosci klawiatury... skorzytaj z UIKeyboardFrameEndUserInfoKey i UIKeyboardWillShowNotification
    2 uniwersalne rozwiazanie za bardzo nie ma sensu z racji tego ze wlasnie kazdy UI masz inny, wiec sam musisz zdecydowac ktore elementy sa wazne podczas wpisywania tekstu a ktore mozesz schowac calkowicie.
    3 mozesz sobie np przygotowac jakas swoja 'uniwersalna' metode i np. widokom ktore chcesz zostawic na ekranie dajesz jakiegos tag-a i te zostawiasz, reszte chowasz.
    Komputer:  iMac 27"  iPhone4  iPad tv² +
    WWW: http://www.tridrops.com
    ____________________________/"'\,,, WezUwiUsz_
    Moja strona na FB
    Moje aplikacje: Easy Cash, Dock Clock, Flat Cube, Crazy Emoji

  6. Avatar _krzysiek
    Dołączył
    May 2007
    Skąd
    Łódź
    Postów
    1,939

    Cytuj | #6

    wezewiusz - ale widok mogę umieścić w scrollview jeżeli będzie taka potrzeba. Każdy interfejs jest inny - to prawda, ale ten schemat wtedy zastosuje sobie na wszekich, które będą mi na to pozwalać poprzez przypisanie jakiejś zmiennej we viewdidload czy innym sposobem.

    Widzę, że masz bogate doświadczenie, także może mi odpowiesz na poniższe pytania:
    1. otrzymujesz info na temat klawiatury w notyfikacji, a jak otrzymujesz info na jej temat kiedy widok się odwróci, wymiary się zmienią?
    2. czy masz jakiś uniwersalny sposób na obliczenie, kiedy interfejs powinien zaanimować się? Jeżeli jest tabbar na dole, zmiana powinna pojawić się odrobinę później i na logikę różni się ten czas na portrait i landscape.
    3. czy masz jakiś uniwersalny sposób na przekalkulowanie ile interfejs powinien mieć miejsca maxymalnie, wiedząc, że na self.view nie masz co polegać, ponieważ jego wymiary mogą być zmienione (zwracając uwagę na możliwość wystąpienia tabbarów, navigation controlerów, przezroczystych navigation controlerów i pasków statusu, innych tabbarów).
    WWW: http://appogeum.com
    appogeum.com

  7. Avatar wezuwiusz
    Dołączył
    Feb 2008
    Skąd
    Dublin, Katowice
    Postów
    783

    Cytuj | #7

    musze Cie rozczarowac ale nie mam w tym temacie doswiadczenia, po prostu kiedys musialem zrobic wlasna klawiature i sie z tym spotkalem. ale nie robilem tego czego potrzebujesz wiec musisz sam doswiadczalnie sprawdzic jak jest z tymi wymiarami i zmiana... ale mysle ze jest to na tyle proste z zrobisz jakis probny projekt i w ciagu paru minut sie zorientujesz co i jak.
    Komputer:  iMac 27"  iPhone4  iPad tv² +
    WWW: http://www.tridrops.com
    ____________________________/"'\,,, WezUwiUsz_
    Moja strona na FB
    Moje aplikacje: Easy Cash, Dock Clock, Flat Cube, Crazy Emoji

Odpowiedz na ten temat