Konwersja Storyboard z iPhone'a na iPada

218

Mam iPhoneaplikację, która ma scenorys. Teraz chcę również dostarczyć iPadaplikację. Zapytałem więc, czy istnieje funkcja, która pomaga mi przekonwertować iPhonescenorys na iPadscenorys.

Aby być konkretnym:

Czy istnieje podobna funkcja, czy jest to tylko sposób ręczny?

Dehlen
źródło
5
och dzięki, nie wiedziałem, że muszę je oznaczyć, zaznaczyłem teraz jedną odpowiedź jako poprawną. Zrobiłem to również w moich starych wątkach, dzięki.
dehlen
1
Szczegółowe informacje z krokami i obrazkami można znaleźć tutaj: datacalculation.blogspot.in/2014/09/…
iOS Test

Odpowiedzi:

535

Znalazłem rodzaj rozwiązania:

  1. Zduplikuj scenorys iPhone'a i zmień jego nazwę MainStoryboard_iPad.storyboard

  2. Zamknij Xcode, a następnie otwórz ten plik w dowolnym edytorze tekstu.

  3. Wyszukaj targetRuntime="iOS.CocoaTouch"i zmień natargetRuntime="iOS.CocoaTouch.iPad"

  4. Zmień kod w MainStoryboard_iPad.storyboard z:

    <simulatedScreenMetrics key="destination" type="retina4"/> do

    <simulatedScreenMetrics key="destination"/>

  5. Teraz zapisz wszystko i ponownie otwórz Xcode. IPad-Storyboard ma tę samą zawartość, co plik iPhone'a, ale wszystko może być nieuporządkowane.

Zaoszczędziło mi to wiele godzin - mam nadzieję, że ci to pomoże

niesamowicie
źródło
20
+1 Gdybym mógł, dałbym ci +100 z mojej własnej reputacji. Genialna rada! Jedyne, czego nie mogłem zrobić, to otworzyć scenorys z Dashcode, więc użyłem TextWrangler (ale myślę, że zrobiłby to dowolny edytor tekstu). Dzięki!
Piotr Justyna
45
Dobra rada, dzięki. W tym momencie możesz również prawdopodobnie zmienić całą szerokość = „320” na szerokość = „768”, wysokość = „480” na wysokość = „1024” itd. Bezpośrednio stąd. Ponieważ jest to o wiele prostsze niż robienie tego element po elemencie w IB.
Ben G
63
nie używaj Dashcode ani textWrangler, wewnątrz xCode po prostu: kliknij prawym przyciskiem myszy w serii ujęć -> „otwórz jako” -> „Kod źródłowy” po zakończeniu, zrób to samo, z wyjątkiem użycia „Konstruktora interfejsów - IOS StoryBoard”
hokkuk
16
@PiotrJustyna możesz to zrobić. Naciśnij start a bountypod pytaniem, wybierz żądaną kwotę i Reward existing answer...
Filip Radelic
33
aby uzyskać format iPada, zmień również kod w MainStoryboard_iPad.storyboard z: <simulatedScreenMetrics key="destination" type="retina4"/>na<simulatedScreenMetrics key="destination"/>
Marcus Schwab
61

Jeśli utworzyłeś projekt uniwersalny, domyślnie zostałaby utworzona pusta tablica na iPada, wystarczy wybrać tablicę iPhone'a, zaznaczyć wszystko (Command + A), skopiować (Command + C) i wkleić na tablicę iPad. Przed kompilacją należy przenieść punkt wejścia z pustej scenorysu do nowo skopiowanej scenorysu.

Centra handlowe
źródło
9
Najlepsza odpowiedź, łatwe rozwiązanie i pozwala później łatwo zmodyfikować interfejs, w przeciwieństwie do pierwszej odpowiedzi. :)
Matt Reid
co z układem?
tryKuldeepTanwar,
10

To nie do końca działało. Zrobiłem coś trochę innego.

  1. Utwórz nowy plik scenariusza dla wersji na iPada
  2. Otwórz zarówno nowy plik, jak i plik, który chcę skopiować w textwrangler (edytor tekstu)
  3. Skopiowałem tekst xml ze starego pliku do nowego pliku między tymi znacznikami xml
  4. Pierwszy tag <scenes> <!--Contents View Controller-->
  5. Wklej tutaj
  6. Tagi końcowe </class> </classes>

To działało dla mnie. Dostałem nowy układ z podłączonymi wszystkimi moimi gniazdkami, co samo zaoszczędziło mi kilka godzin.

Nelson Brian
źródło
1
+1 inni nie pracowali dla mnie, a to sprawia, że ​​wszystko działa zgodnie z oczekiwaniami
Shereef Marzouk
4
Możesz to zrobić z poziomu Xcode. Kliknij prawym przyciskiem myszy / kliknij .storyboardpliki i kliknij, Open As > Source Codeaby wyświetlić surowy plik XML.
Matt Kantor,
8

Po przeczytaniu wielu wątków na temat przepełnienia stosu odkryłem, że rozwiązaniem jest-

1. Zduplikuj tablicę iPhone'a i zmień jej nazwę MainStoryboard_iPad.storyboard

2. kliknij prawym przyciskiem myszy w serii ujęć -> „otwórz jako” -> „Kod źródłowy”.

3. Wyszukaj celRuntime = „iOS.CocoaTouch” i zmień go na targetRuntime = „iOS.CocoaTouch.iPad”

5. Wyszukaj <simulatedScreenMetrics key="destination" type="retina4"/>i zmień na<simulatedScreenMetrics key="destination"/>

4. Teraz zapisz wszystko i kliknij prawym przyciskiem myszy na MainStoryboard_iPad.storyboard „otwórz jako” -> „IOS StoryBoard” 5. być może będziesz musiał zmienić swoje ograniczenia. To wszystko, co zrobiłeś.

Bharat
źródło
8
1. Create New Storyboard file with MainStoryboard_iPad.storyboard
2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
Kirit Vaghela
źródło
8

1 - Utwórz swój "MainStoryboard_iPad.storyboard";

2 - Kliknij prawym przyciskiem myszy i wybierz "MainStoryboard_iPhone.storyboard"„Otwórz jako -> Kod źródłowy”. Skopiuj wszystko;

3- Kliknij prawym przyciskiem myszy i wybierz "MainStoryboard_iPad.storyboard"„Otwórz jako -> Kod źródłowy”. Wklej wszystko. Teraz Wyszukaj i zmień:

  • targetRuntime="iOS.CocoaTouch" to targetRuntime="iOS.CocoaTouch.iPad"
  • type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" to type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.iPad.XIB"

4 - Zapisz. Teraz ponownie otwórz, ale za pomocą konstruktora interfejsów. Będziesz musiał tylko zmienić układ.

Tej metody można także użyć w przypadku plików .xib

Ricardo Anjos
źródło
1
To najlepszy sposób na zrobienie tego. ponieważ wszystkie widoki i komponenty zostaną przeskalowane do formatu iPada.
Ben,
1
W najnowszej wersji ios7 nie trzeba zmieniać typu = "com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB".
super9
5

Idzie w drugą stronę, ale udało mi się zrobić zaznaczenie wszystkich i skopiuj z mojej serii ujęć na iPadzie (~ 35 scen) i wkleić ją do mojej serii ujęć na iPhonie. Rozmiary scen zostały automatycznie dostosowane. Widziałem tylko dwa problemy, musiałem wymienić UISplitViewController (ponieważ jest to tylko iPad), a domyślne tło stało się przezroczyste zamiast szarego (wciąż pracuje nad poprawieniem tego poprawnie, bez ręcznego ustawiania tła dla wszystkiego).

EDYCJA: Wygląda na to, że domyślne tło dla UITableView w Inspektorze atrybutów jest dość dziwne. Musiałem ręcznie ustawić tło na „Kolor tła widoku tabeli grupowej” dla zgrupowanych widoków tabeli i „Biały kolor” dla niezgrupowanych widoków tabeli. Następnie był wyświetlany jako „Domyślny” (zakładam, że odtąd dopasował ustaloną wartość). - W rzeczywistości, jeszcze łatwiejsze, zmiana z „Zgrupowane” na „Statyczne” iz powrotem wydaje się resetować domyślny kolor.

Symetryczny
źródło
4

Oto coś, co pozwoliło mi zaoszczędzić wiele godzin i może pomóc osobom z umiejętnościami w Pythonie.

Tworzę aplikację przez ostatnie dwa miesiące, koncentrując się na iPadzie iterującym UX z zespołem.

Dzisiaj skupiłem się na zbudowaniu wersji iPhone'a, wykonując powyższe kroki (dzięki!), Ale nie chciałem wtedy zmieniać rozmiaru wszystkich elementów interfejsu użytkownika z wymiarów iPada w edytorze wizualnej scenorysu.

Napisałem więc ten mały skrypt jig Pythona, aby skanować plik scenorysu w poszukiwaniu x, y, szerokości, wysokości i przeskalować wszystko o współczynnik 320/768. Pozwoliło mi to skupić się na drobnych korektach.

  1. Skopiuj scenorys iPada do nowego pliku. (np. iPhoneStoryboard.storyboard)

  2. Uruchom skrypt poniżej z skopiowaną nazwą pliku scenariusza jako pierwszym parametrem.

  3. Wygeneruje plik wyjściowy z przyrostkiem _adjusted.storyboard (np. IPhoneStoryboard.storyboard_adjusted.storyboard)

Mam nadzieję, że to pomoże...

import re
import sys
import math

afile = sys.argv[1]

scale = 320./768.

number_pattern = '[-0-9]+(.[0-9]+)?'
#width_pattern = 'width="[-0-9]+( ?px)?"'
width_pattern = 'width="[-0-9]+(.[0-9]+)?( ?px)?"'
height_pattern = 'height="[-0-9]+(.[0-9]+)?( ?px)?"'
x_pattern = 'x="[-0-9]+(.[0-9]+)?( ?px)?"'
y_pattern = 'y="[-0-9]+(.[0-9]+)?( ?px)?"'


def replacescaledvalue(scale,pattern,sometext,replacefmt) :
    ip = re.search(pattern, sometext, re.IGNORECASE)
    if(ip) :
        np = re.search(number_pattern,ip.group(0))
        if(np) :
            val = float(np.group(0))
            val = int(math.floor(val*scale))
            sval = replacefmt+str(val)+'"'#+'px"'
            newtext = re.sub(pattern,sval,sometext)
            return newtext
    else :
        return sometext

fin = open(afile)
fout = open(afile+"_adjusted.storyboard", "wt")
for line in fin:
    newline = line
    newline = replacescaledvalue(scale,width_pattern,newline,'width="')
    newline = replacescaledvalue(scale,height_pattern,newline, 'height="')
    newline = replacescaledvalue(scale,x_pattern,newline, 'x="')
    newline = replacescaledvalue(scale,y_pattern,newline, 'y="')
#   print newline
    fout.write( newline )

fin.close()
fout.close()
Chris Robertson
źródło
1
Cześć Chrish, jestem nowy w fitonie. więc nie jestem w stanie zrozumieć kodu, aby zmienić storyboard iPhone'a na iPada. więc możesz mi pomóc w tej sprawie. Mój storyboard na iPada przekształca się w storyboard na iPhone'a bez żadnych problemów. ale muszę przekonwertować scenorys iPhone'a na iPada. Więc gdzie wymagają zmiany potrzebne w powyższym skrypcie lub możesz udostępnić skrypt, który konwertuje iPhone'a na iPada. Z góry dziękuję.
Shubham
@ Chris Robertson Chris, gdybym chciał użyć tego skryptu do konwersji iPhone'a na iPada, czy zmieniłbym „skalę = 320./768”. na „skala = 768./320.”?
Charles Robertson,
3

Przejdź do Podsumowania celu i zmień urządzenia na uniwersalne, a następnie zejdź na dół i ustaw wersję iPada na dowolną scenorysę, którą lubisz, w tym skopiowaną i jeśli chcesz.

AMAN77
źródło
3

Tak jak krótka uwaga dla tych, którzy mogli mieć mój problem z tym:

Mój problem:

Treść scenorysu została skopiowana ładnie do nowego pliku tablicy, który dodałem. Nie wprowadziłoby to jednak zmian w moim wyposażonym iPadzie. Zauważając, że musiałem przełączyć wyznaczoną scenorys dla celu kompilacji (patrz zdjęcie), niech zmiany się pokażą.

Gdybym miał punkty, opublikowałbym zdjęcie, ale ustawienie znajduje się w:

Nawigator projektu w menu źródła po lewej stronie, cel główny karty ogólnej projektu (środkowy panel), informacje o wdrażaniu (druga podpunkt), z wybraną kartą przycisku iPada.

Stamtąd wybierz scenorys w „głównym interfejsie”.

Dzięki za post, mam nadzieję, że ta wzmianka pomoże gdzieś się zaczepić.

dgetzin
źródło
3

Dla zabawy, w XCode 5.1 i iOS 7.1 musiałem również zmienić wartości „toolVersion” i „systemVersion” na:

toolsVersion="5023" systemVersion="13A603"

Bez tego nowy plik scenorysu nie zostałby skompilowany

TooManyEduardos
źródło
3

Używając klas rozmiaru XCode6, nie musisz już konwertować scenorysu na iPada. Z tej samej Storyboard można korzystać zarówno na iPhonie, jak i na iPadzie, dzięki czemu nie musisz aktualizować dwóch plików.

Powstały scenorys jest kompatybilny z iOS7 +.

Przeczytaj więcej na ten temat tutaj: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html#//apple_ref/doc/uid/TP40014436-CH6-SW1

Użyj klas rozmiarów, aby włączyć scenorys lub plik XIB do pracy ze wszystkimi dostępnymi rozmiarami ekranu. Dzięki temu interfejs użytkownika aplikacji może działać na dowolnym urządzeniu z systemem iOS.

Ciprian Rarau
źródło
3

Dla Xcode10

  1. Po prostu duplikuj Main.storyboard

  2. Następnie zmień nazwy plików na Main_iPad.storyboardiMain_iPone.storyboard

  3. Ustaw odpowiednie nazwy w .plist

wprowadź opis zdjęcia tutaj

4. Wystarczy wybrać odpowiedni .storyboard do skonfigurowania wprowadź opis zdjęcia tutaj

Svitlana
źródło
2

Ta funkcja jest teraz wbudowana. Na przykład, jeśli zmienisz ustawienia projektu w Informacje o wdrożeniu -> Urządzenia z iPhone'a na Universal, pojawi się następujące okno dialogowe:

wprowadź opis zdjęcia tutaj

Freddie
źródło
3
Może to być błąd w Xcode, ale nigdy nie miałem tej pracy. Powstała storyboard na iPada nie jest dodawany do projektu i nie wygląda na to, że został stworzony.
s73v3r
2

Śledziłem ten wątek, gdy wczoraj trafił mnie ten sam problem. Kroki, które podążyłem

  1. W przypadku Xcode 5.1 musiałem trochę wyczyścić scenorys iPhone'a, na przykład brakujące ponowne użycie Identyfikatory komórek tabeli, podać identyfikator tablicy scen dla każdego kontrolera, usunąć nieużywane sceny.
  2. Skopiuj MainStoryboard_iPhone.storyboard do MainStoryboard_iPad.storyboard.
  3. Za pomocą edytora vi - zmieniono targetRuntime="iOS.CocoaTouch"natargetRuntime="iOS.CocoaTouch.iPad"
  4. Zmień kod w MainStoryboard_iPad.storyboard z: <simulatedScreenMetrics key="destination" type="retina4"/>na<simulatedScreenMetrics key="destination"/>
  5. Otwórz projekt w Xcode.
  6. Zmieniono urządzenia do wdrażania na Universal - wybierz opcję NIE kopiowania iPhone Storyboard.
  7. Xcode ustawi domyślnie Docelowy poziom wdrożenia na 7.1, zajął się przestarzałymi funkcjami.
  8. Aby naprawić błąd niewłaściwego widoku w serii ujęć iPada - Zmieniono układ ramki dla kontrolerów powodujących błędy.

To było to .. Dziękuję wszystkim za pomoc ..

Shaina Prakash
źródło
1

Najłatwiejszym i najbardziej niezawodnym sposobem na to jest skopiowanie wklejania z serii ujęć iPada.

  1. Utwórz nowy scenorys i nazwij go jak MainStoryboard_ipad.
  2. Uczyń swoją aplikację Uniwersalną, ustawiając właściwość Urządzenia na Uniwersalną na stronie Podsumowanie właściwości Docelowej dla twojego projektu. wprowadź opis zdjęcia tutaj
  3. Otwórz tablicę iPhone'a, wybierz wszystko i skopiuj
  4. Otwórz tablicę ujęć iPada i wklej.

Musisz zmienić rozmiar, ale może to być szybsze niż odtworzenie całej scenorysu.

mcohen75
źródło
1

Istnieje naprawdę proste rozwiązanie dla wersji Xcode, które obsługują klasy wielkości (Testowane w Xcode 7, która jest aktualną wersją w momencie pisania). Zaznacz pole wyboru „użyj klas wielkości” w pliku scenorysu ( Inspektor plików ), potwierdź to okno dialogowe. Następnie usuń zaznaczenie tego samego pola wyboru - Xcode zapyta, czy chcesz używać tej scenorysu z iPhonem lub iPadem i odpowiednio przekonwertować w niej ekrany. Nie ma potrzeby bezpośredniej edycji pliku scenorysu . Zarówno dla iPada, jak i iPhone'a, po prostu skopiuj tę samą scenorys i skonfiguruj jedną dla iPada i drugą dla iPhone'a, używając opisanej metody.

I zanim ktoś zasugeruje użycie klas wielkości - chociaż są one świetne, są mniej wygodne w przypadku wysoce dostosowanego interfejsu użytkownika, takiego jak gry itp

GreatWiz
źródło
1

Inne podejście

  1. Dodaj pusty kontroler widoku z kontrolerem nawigacji w Storyboard na iPadzie

  2. Zmień klasę na klasę pierwszego ViewController używanego na iPhonie, „fooViewController”

  3. Dodaj identyfikator scenorysu do scenorysu iPhone'a „fooViewController_storyboard_identifier” dla pierwszego ViewController

  4. Przejdź do „fooViewController.m”

  5. Dodaj bool Zmienna bool nibWasLoadForIpad=false

  6. Idź do viewDidLoad-Method

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && !nibWasLoadForIpad)
{
    nibWasLoadForIpad=true;
    UIStoryboard* Storyboard_iphone=[UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
    fooViewController *controller = [Storyboard_iphone instantiateViewControllerWithIdentifier:@"fooViewController_storyboard_identifier"];
    [self.navigationController pushViewController:controller animated:YES];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
}

(ps. Wiem, że problemem jest to, że tła widoku zostaną ustawione na biały)

David ze Studio.201
źródło
0

Powinieneś utworzyć raport o błędach w Apple. Można powiedzieć, że to mój duplikat (10167030), który jest otwarty od września 2011 roku. Z mojego punktu widzenia frustrujące jest to, że ta funkcja istniała w Xcode 3 ...

Stephen Darlington
źródło
0

Dziękuję wszystkim za odpowiedzi.

Postępowałem zgodnie z powyższymi krokami, ale kiedy uruchomiłem aplikację pod symulatorem lub iPadem, nadal korzystałem z serii ujęć iPhone'a.

Z jakiegoś powodu, kiedy zmieniłem urządzenie docelowe na Uniwersalne zamiast iPhone'a, Xcode (v5.0) nie zaktualizował pliku app-Info.plist, aby uwzględnić scenorys iPada, więc musiałem ręcznie dodać następujący wpis ( za pomocą edytora plist w Xcode):

Podstawowa nazwa pliku głównego scenorysu (iPad) ==> MainStoryboard_iPad

Pete
źródło
0

Po prostu zmieniam (oprócz odpowiedzi z @tharkay):

 <device id="ipad9_7" orientation="landscape">

i działa świetnie!

Używam tego w XCode 8.3.3

Być
źródło