Xcode - czy istnieje sposób na przeciągnięcie komponentu z jednego widoku do drugiego bez utraty jego ramki?

91

To, co chciałbym zrobić, to przeciągnąć komponent / widok z jednego nadzoru do drugiego w konstruktorze interfejsu Xcode bez resetowania jego klatki / pozycji.

Wydaje się, że domyślnym zachowaniem Xcode podczas wykonywania tej czynności jest wyśrodkowanie widoku przesuwanego w pionie i poziomie w nowym widoku nadzoru, przy jednoczesnym zachowaniu jego wymiarów. Jest to niezwykle frustrujące, ponieważ oznacza, że ​​w nowym widoku należy ręcznie zmienić położenie widoku. Ale ustawiłem go poprawnie, zanim go przesunąłem, więc chciałbym, aby Xcode po prostu zapamiętał wszystkie atrybuty swojej ramki, a nie tylko jej szerokość / wysokość. czy to możliwe?

aroth
źródło
W przeszłości, jeśli wycinasz i wklejasz, rama pozostała taka sama. Spróbuj i zobacz.
David H,
Dzięki za sugestię, niestety nie wydaje się działać. Albo po prostu źle go wycinam / wklejam. Dzieje się tak, że XCode zastępuje widok, do którego próbuję wkleić, widokiem, który wklejam (a jeśli spróbuję wkleić wiele elementów naraz, po prostu używa pierwszego elementu z listy). Kopiowanie robi to samo.
aroth
Spróbuj wkleić go do lewej kolumny - listy. Wybierz super widok, a następnie wklej. W przeciwnym razie przepraszam, brak sugestii.
David H
Próbowałem w obie strony. Nie działa. Skończyło się na tym, że musiałem to zrobić na własnej skórze.
aroth,
Wydaje się, że istnieje obejście problemu w stackoverflow.com/questions/12034293/…, ale nie jest ono zbyt dobre
Eugene Osovetsky

Odpowiedzi:

224

Inne rozwiązanie:

  1. Następnie wybierz elementy, które chcesz umieścić w podglądzie
  2. (na pasku narzędzi) Edytor> Osadź w> typ widoku do osadzenia.
Sójka
źródło
12
Dzięki. To powinna być akceptowana odpowiedź. Wybierz wszystkie widoki, które chcesz przenieść do nowego super widoku -> umieść w widoku -> przenieś nowy widok kontenera do żądanego super widoku -> edytor - nieobsadzony. Voila! Wszystkie widoki są w nowym widoku nadzoru z poprawnymi ramkami.
Accatyyc
18
Szkoda, że ​​żadne automatyczne ograniczenia układu nie są kopiowane, jedyny sposób, jaki widziałem, to ręczna edycja xml xib
James
1
Jedną rzeczą, która wciąż jest dziwna, jest to, że kiedy osadzam moje podglądy w ich nowym widoku superwizji, widok ten ma dziwne współrzędne. Zaczyna się od -20 xi -20 y, a jeśli ustawię na 0,0, wszystko jest poza środkiem.
user3344977
1
@James Robiłem to. Ale odkryłem, że jeśli masz widoki Command-X_Command-V w Xcode 6, przestrzegane są ograniczenia między wklejonymi widokami. Mała poprawa.
Steven Kramer
4
@StevenKramer Próbowałem z Command-X i Command-V, nie działało dla mnie. Czy masz więcej kroków, aby to zrobić? Jestem zainteresowany
arh
28

Znalazłem coś, co może wam pomóc!

Zadanie polega na przegrupowaniu „widoków podrzędnych” w „widok nadrzędny”, tak aby stały się one elementami podrzędnymi widoku nadrzędnego w hierarchii i zachowały fizyczne pozycje na ekranie, tak jak przed wykonaniem czynności.

Najpierw dostosuj widok rodzica, aby fizycznie obejmował obszar widoków potomnych. Po drugie, upewnij się, że wszystkie dzieci znajdują się poniżej tego na liście widoków.

Teraz zaznacz wszystkie dzieci za pomocą myszy i przesuń je np. O jeden piksel w górę i jeden piksel w dół (żeby powiedzieć, że IB jest jakaś zmiana). Po tym uwolnieniu dzieci w magiczny sposób staną się dziećmi rodzica i zachowają swoje pozycje na widoku.

U mnie działa na OSX 10.8.2 i Xcode 4.6.

Powodzenia!

vedrano
źródło
Niesamowite ... To nawet nie psuje wylotów i ramek. Osadzenie w widoku przerywa ramki. Metoda wycinania pasty łamie wyloty i ramki.
jeet.chanchawat
22

Udało mi się zaoszczędzić sporo czasu spędzonego na przestawianiu rzeczy i zrobiłem to:

  1. Dodaj widok nadrzędny w Interface Builder na tym samym poziomie, co przyszłe podglądy.
  2. Otwórz scenorys w edytorze tekstu i skopiuj przyszłe podglądy wewnątrz tagów podwidoków widoku nadrzędnego. XCode zostanie zaktualizowany, gdy go zapiszesz.

Nie jest to jednak zbyt eleganckie, nie rozumiem, dlaczego XCode nie obsługuje go za pomocą Shift lub czegoś podobnego.

Stepan Hruda
źródło
3
To jedyna odpowiedź, która konsekwentnie działa dla mnie w Xcode 5 bez zamieszania. „Edytor-> Osadź w” wydaje się być poprawną odpowiedzią, ale nie zawsze wyświetla widok, do którego chcę przenieść podglądy.
Denton
10
  1. Wybierz wszystkie kontrolki, które chcesz przenieść z jednego UIView do innego UiView (nay be child) lub ScrollView

  2. Wytnij Kopiuj

  3. Teraz po przeciągnięciu nowego UIView / ScrollView do istniejącego UIView, nie klikaj raz, aby go zaznaczyć, zamiast tego kliknij DWUKROTNIE nowy UIView / ScrollView i wklej wszystkie kontrolki.

  4. Różnica odległości pozostanie taka sama dla wszystkich kontrolek, ale może być konieczna ponowna zmiana ich położenia. Więc nie klikaj nigdzie, dopóki nie zmienisz ich położenia, po prostu zmień położenie wszystkich kontrolek za pomocą strzałek nawigacyjnych, ponieważ wszystkie są już zaznaczone, lub możesz je wybrać ponownie.

UWAGA: jestem na XCode 4.2

Sourangshu Biswas
źródło
Hej, jeśli to zadziała, to najlepsza odpowiedź tutaj (do przeciągania wielu kontrolek do istniejącego widoku)
Colin,
@me w Xcode 4.6.2 nie można otworzyć dodatkowego okna widoku przez dwukrotne kliknięcie, więc ta metoda nie działa.
Colin
Działa dobrze w Xcode 5. Względne pozycjonowanie pozostaje takie samo, tylko pionowe pozycjonowanie jest wyłączone, ale wystarczy zmienić położenie całej grupy na raz.
qix
złą rzeczą jest to, że tracisz ograniczenia związane z autoukładaniem: '( indiestack.com/2013/12/transplanting-constraints tutaj możesz znaleźć sposób na "przeszczepianie" ograniczeń
Joan Cardona
4

Zrobiłem coś podobnego do rozwiązania Stepana, bez użycia storyboardu. W IB, gdy widok ViewControllera jest otwarty:

  1. Utwórz inny widok oprócz głównego widoku VC
  2. Przenieś wszystkie widoki podrzędne do drugiego widoku, przeciągając je z jednego widoku do drugiego (przeciągnięcie z listy po lewej stronie resetuje ich pozycję) Jeśli nie możesz ich wybrać z IB za pomocą myszy, wybierz wszystkie z listy po lewej stronie, a następnie wybierz jeden końcowy widok podrzędny z panelu IB za pomocą przycisku „cmd”.
  3. Wróć do ostatecznego widoku początkowego widoku głównego.
  4. Usuń dodany widok, wszystko gotowe.
Yunus Nedim Mehel
źródło
2

To najlepsze rozwiązanie, aby skopiować podglądy do innego widoku i zachować pozycje:

  1. Następnie wybierz elementy, które chcesz umieścić w podglądzie
  2. Edytor -> Osadź w -> Widok
  3. Skopiuj ten widok (Cmd + C)
  4. Cofnij (Cmd + Z) (Ponieważ chciałeś tylko podglądów podrzędnych)
  5. Przejdź do widoku, w którym chcesz wyświetlić podglądy i wklej go (Cmd + V)
  6. Wybierz widok osadzania, który skopiowałeś- wkleiłeś i Edytor -> Unembed

Krok 6 spowoduje usunięcie widoku osadzania i skopiujesz tylko podglądy.

Dhruv Goel
źródło
2

Xcode Interface Builder powoduje bałagan, gdy widok nadrzędny jest przeciągany i upuszczany do innego widoku (UIView, ScrollView, StackView)

P:
Osadzanie widoku (który zawiera wiele innych podglądów podrzędnych) w ScrollView lub w innym widoku najwyższego poziomu nie jest proste z tym, co widziałem do tej pory. To, co dzieje się wkrótce potem, może wydawać się, że wszystkie podglądy są niewłaściwe, ponieważ nie mogą znaleźć ich oryginalnej ramki.

Odp .:
Wykonaj następujące kroki, a będziesz w stanie rozwiązać problem łatwiej, jak to możliwe:

  1. Następnie wybierz elementy, które chcesz umieścić w podglądzie
  2. Przejdź do paska menu, Edytor -> Osadź w -> Widok
  3. Skopiuj ten nowy widok (Cmd + C) z widokami podrzędnymi (dla mnie obecnie wszystkie ograniczenia zostały zachowane w tym momencie)
  4. Przejdź do widoku (czy to ScrollView, czy może to być StackView), w którym chcesz umieścić widoki podrzędne i wklej (Cmd + V) skopiowany widok
  5. Wybierz wklejony widok osadzania (który został wcześniej utworzony na nowo) i przejdź do paska menu Xcode, Editor -> Unembed

Nie, jeszcze nie skończone! Czasami może się zdarzyć, że jest jeszcze kilka problemów związanych z ograniczeniami interfejsu użytkownika, będziesz musiał je odpowiednio rozwiązać.

Randika Vishman
źródło
1

Wykryłem inne podejście. Zasadniczo jest to: Przesuń = Wytnij + Wklej

W ten sposób możesz:

  • ustaw wszystkie podglądy podrzędne jako elementy podrzędne nowego widoku rodzica (P ')
  • zachowaj (prawie) wszystkie swoje ograniczenia w Storyboard opartym na Auto-Layout
  • zachowaj względne pozycje (ramki) subview jeden względem drugiego

W ten sposób nie:

  • edytuj plik Storyboard w edytorze tekstu

Podstawą jest to, że każdy widok z wyjątkiem jednego (głównego) w Storyboard ma swój widok nadrzędny . Następnie, kiedy kopiujesz / przenosisz wiele podglądów podrzędnych, tracisz klatki i ograniczenia .

Odpowiedź jest dość prosta. Tworzysz kopię swoich podglądów podrzędnych (SV), kopiując ich widok nadrzędny (P) do nowego widoku nadrzędnego (P '). W ten sposób może być konieczne ponowne utworzenie tylko ograniczeń z tego nowego widoku nadrzędnego (P ') do jego nowego widoku nadrzędnego, ale nie dla każdego widoku podrzędnego, który chcesz przenieść.

Po skopiowaniu widoku rodzica (P) do nowego (P '), z tego nowego widoku (P'):

  • usuń wszystkie dzieci z wyjątkiem tych, które chciałeś przenieść
  • odtwórz nowe ograniczenia nadrzędne (P ')
  • odtworzyć możliwe gniazda Interface Builder do (SV)

A z oryginalnego widoku rodzica (P):

  • usuń wszystkie dzieci, które chciałeś przenieść

Przed:

Widok 1

Widok 2

P.

SVs-chcesz-przenieść

SV-nie-chcesz-się-ruszać

Widok 3

Po:

Widok 1

Widok 2

P.

SV-nie-chcesz-się-ruszać

Widok 3

P '

SV-chcesz-przenieść

Powinienem podkreślić, że nie uogólnia to dobrze, jeśli masz np. UIScrollView jako widok nadrzędny. Wtedy jego kopia byłaby ponownie UIScrollView, co może nie być pożądane.

Inną rzeczą jest to, że kiedy usuwasz niektóre z podglądów podrzędnych (SV) w oryginalnym widoku nadrzędnym (P), może być konieczne ponowne utworzenie niektórych ograniczeń, jeśli inne (nieruchome podglądy) odnoszą się do nich. Ale i tak powinieneś to zrobić.

vedrano
źródło
0

W rozwiązaniu tego problemu pomogło mi-

  1. Utwórz żądany widok nadrzędny (widok przewijania lub uiview) w xib na poziomie głównym i odpowiednio zmień jego rozmiar
  2. Skopiuj wszystkie widoki, które mają być podglądami podrzędnymi tego widoku nadrzędnego i wklej je do nowego widoku utworzonego w kroku 1
  3. W tym momencie zduplikujesz te widoki. Nowo dodane widoki byłyby niewyrównane, ale nadal w tej samej kolejności i w tej samej odległości względem siebie, wyrównaj je w xib, aby dopasować ich granice do starych kopii tego samego widoku (zakłada się, że nowy widok nadrzędny ma takie same ograniczenia jak stara)
  4. Nowo dodane widoki utracą część ograniczeń. Aby je naprawić, skorzystaj ze starych widoków
  5. Usuń stare widoki z xib
neha
źródło