Storyboard'u iPhone'dan iPad'e Dönüştürme


218

iPhoneBir film şeridi olan bir uygulamam var. Şimdi ben iPadde başvuru yapmak istiyorum . Bu yüzden, iPhonefilm şeridimi bir videoya dönüştürmeme yardımcı olan bir işlev olup olmadığını sordumiPad film .

Spesifik olmak:

Benzer bir fonksiyon var mı yoksa sadece manuel yol var mı?


5
oh teşekkürler ben onları işaretlemek zorunda bilmiyordum, ben bir doğru cevap şimdi doğru olarak işaretlenmiş. Bunu eski konularımda da yaptım, teşekkürler.
dehlen

Yanıtlar:


536

Bir çeşit çözüm buldum:

  1. İPhone-Storyboard'unuzu çoğaltın ve yeniden adlandırın MainStoryboard_iPad.storyboard

  2. Xcode'u kapatın ve bu dosyayı herhangi bir metin düzenleyicisini açın.

  3. Arama targetRuntime="iOS.CocoaTouch"ve değiştirmetargetRuntime="iOS.CocoaTouch.iPad"

  4. MainStoryboard_iPad.storyboard'daki kodu şununla değiştirin:

    <simulatedScreenMetrics key="destination" type="retina4"/> için

    <simulatedScreenMetrics key="destination"/>

  5. Şimdi her şeyi kaydedin ve Xcode'u yeniden açın. İPad-Storyboard, iPhone dosyasıyla aynı içeriğe sahiptir, ancak her şey düzensiz olabilir.

Bu bana saatler kazandırdı - umarım bu sana yardımcı olur


20
+1 Yapabilseydim sana kendi saygınlığımdan +100 verirdim. Mükemmel tavsiye! Yapamadığım tek şey, storyboard'u Dashcode ile açmaktı, bu yüzden TextWrangler'ı kullandım (ancak herhangi bir metin düzenleyicinin yapabileceğini düşünüyorum). Teşekkürler!
Piotr Justyna

45
İyi tavsiye, teşekkürler. Siz oradayken, büyük olasılıkla tüm genişlik = "320" yi genişlik = "768", yükseklik = "480" olarak yükseklik = "1024", vb. Olarak doğrudan buradan değiştirmek isteyebilirsiniz. IB'de birer birer yapmaktan çok daha basit olduğu için.
Ben G

63
xCode içinde Dashcode veya textWrangler kullanmayın: film şeridine sağ tıklayın -> “aç” -> “Kaynak Kodu” bittiğinde, “Interface Builder - IOS
StoryBoard

16
@PiotrJustyna bunu yapabilirsiniz. start a bountyReward existing answer
Aşağıdaki

33
iPad formatını almak için MainStoryboard_iPad.storyboard'daki kodu da şu adresten değiştirin: <simulatedScreenMetrics key="destination" type="retina4"/>-<simulatedScreenMetrics key="destination"/>
Marcus Schwab

61

Evrensel bir proje oluşturmuş olsaydınız, varsayılan olarak boş iPad film şeridi oluşturulmuş olurdu, sadece iPhone film şeridi tümünü seçmeniz (Command + A), kopyala (Command + C) ve iPad film şeridine yapıştırmanız gerekir. Derlemeden önce giriş noktasını boş film şeridinden yeni kopyalanan film şeridine taşıdığınızdan emin olun.


9
En iyi cevap, kolay çözüm ve en iyi cevaptan farklı olarak arayüzü kolayca değiştirmenizi sağlar. :)
Matt Reid

Peki ya düzen?
tryKuldeepTanwar

10

Bu benim için pek işe yaramadı. Biraz farklı bir şey yaptım.

  1. İPad sürümü için yeni bir hikaye panosu dosyası oluşturun
  2. Hem yeni dosyayı hem de kopyalamak istediğim dosyayı textwrangler'da (metin düzenleyici) açın
  3. Xml metnini eski dosyadan bu xml etiketleri arasındaki yeni dosyaya kopyaladı
  4. İlk Etiket <scenes> <!--Contents View Controller-->
  5. Buraya Yapıştır
  6. Etiketleri Sonlandır </class> </classes>

Bu benim için çalıştı. Tüm çıkışlarım bağlıyken yeni bir düzen aldım, bu da beni birkaç saat kurtardı.


1
+1 diğerleri benim için çalışmadı ve bu her şeyin beklendiği gibi çalışmasını sağlıyor
Shereef Marzouk

4
Bunu Xcode içinden yapabilirsiniz. Sadece sağ / kontrol .storyboarddosyaları tıklayın Open As > Source Codeve ham XML görüntülemek için tıklayın .
Matt Kantor

8

Stackoverflow üzerinde birçok konu okuduktan sonra çözüm olduğunu keşfetti-

1. iPhone-Storyboard'unuzu çoğaltın ve MainStoryboard_iPad.storyboard olarak yeniden adlandırın

2. film şeridine sağ tıklayın -> “farklı aç” -> “Kaynak Kodu”.

3. targetRuntime = "iOS.CocoaTouch" öğesini arayın ve targetRuntime = "iOS.CocoaTouch.iPad" olarak değiştirin.

5. Arayın <simulatedScreenMetrics key="destination" type="retina4"/>ve olarak değiştirin<simulatedScreenMetrics key="destination"/>

Şimdi her şeyi kaydedin ve MainStoryboard_iPad.storyboard “as as open” -> "IOS StoryBoard" 'a sağ tıklayın. Tüm yaptığın bu.


8
1. Create New Storyboard file with MainStoryboard_iPad.storyboard
2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard

8

1 - Oluşturun "MainStoryboard_iPad.storyboard";

2 - Sağ tıklayın "MainStoryboard_iPhone.storyboard" ve "Farklı aç -> Kaynak Kodu". Her şeyi kopyalayın;

3- Size sağ tıklayın "MainStoryboard_iPad.storyboard"ve "Farklı aç -> Kaynak Kodu". Her şeyi yapıştırın. Şimdi Ara ve değiştir:

  • 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 - Kaydet. Şimdi yeniden açın ama arayüz oluşturucuyu kullanarak. Sadece yeniden ayarlamanız gerekecek.

Bu yöntem .xib dosyaları için de kullanılabilir


1
Bunu yapmanın en iyi yolu budur. çünkü tüm görünümler ve bileşenler ipad biçiminde yeniden boyutlandırılacaktır.
Ben

1
İos7'nin son sürümünde type = "com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" türünü değiştirmenize gerek yoktur.
super9

5

Bu başka yoldan gidiyor, ancak iPad hikaye tahtasımda (~ 35 sahneler) bir tümünü seç & kopyalamayı ve iPhone film şeridime yapıştırmayı başardım. Sahne boyutları otomatik olarak ayarlandı. Sadece iki sorun gördüm, UISplitViewController'ı değiştirmek zorunda kaldım (sadece iPad olduğu için) ve varsayılan arka plan gri yerine şeffaf hale geldi (hala her şey için arka planı manuel olarak ayarlamadan düzgün bir şekilde düzeltmeye çalışıyor).

EDIT: Nitelikler denetçisinde UITableView için varsayılan arka plan oldukça garip görünüyor. Elle gruplandırılmış tablo görünümleri için "Grup tablo görünümü arka plan rengi" ve gruplandırılmamış tablo görünümleri için "beyaz renk" için arka plan ayarlamak zorunda kaldı. Daha sonra "Varsayılan" olarak görüntülendi (daha sonra sabit kodlanmış bir değerle eşleştiğinden eminim). - Aslında, daha da kolay, "Gruplanmış" dan "Statik" ve geri değiştirmek varsayılan rengi sıfırlıyor gibi görünüyor.


4

İşte beni saatlerce kurtaran ve Python yeteneklerine sahip olanlara yardım edebilecek bir şey.

Son iki aydır, yalnızca iPad ile UX'i ekiple yinelemeye odaklanan bir uygulama geliştiriyorum.

Bugün iPhone sürümünü oluşturmaya odaklandı, yukarıdaki adımları takip etti (teşekkürler!) Ancak daha sonra görsel film şeridi düzenleyicisindeki iPad boyutlarından tüm ui öğelerini yeniden boyutlandırmak istemedim.

Bu yüzden, x, y, genişlik, yükseklik için film şeridi dosyasını taramak ve her şeyi 320./768 oranına göre ölçeklendirmek için bu küçük python jig komut dosyasını yazdım. O zaman sadece ince ayarlara odaklanmama izin verdi.

  1. İPad film şeridinizi yeni bir dosyaya kopyalayın. (örneğin iPhoneStoryboard.storyboard)

  2. Aşağıdaki komut dosyasını kopyalanan film şeridi dosya adıyla ilk parametre olarak çalıştırın.

  3. _Adjusted.storyboard soneki ile çıktı dosyası oluşturur (örn. İPhoneStoryboard.storyboard_adjusted.storyboard)

Umarım yardımcı olur...

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()

1
Merhaba Chrish, ben phython'da yeniyim. bu yüzden iphone film şeridini iPad'e değiştirmek için kodu anlayamıyorum. bu yüzden lütfen bana bu konuda yardım edebilir misin? Benim ipad film şeridim herhangi bir sorun olmadan iphone film şeridine dönüştürülüyor. ama iphone film şeridi iPad'e dönüştürmem gerekiyor. Yani nerede gerekli script yukarıdaki ihtiyaç değişiklikleri veya iphone ipad dönüştüren komut dosyasını paylaşabilirsiniz. Şimdiden teşekkürler.
Shubham

@Chris Robertson Chris, bu betiği iPhone'dan iPad'e dönüştürmek için kullanmak istersem, "scale = 320./768" i değiştiririm. 'ölçek = 768./320'?
Charles Robertson

3

Hedef Özetinize gidin ve cihazları evrensel olarak değiştirin, ardından aşağı inin ve ipad sürümünü, kopyalanmış ve yeniden adlandırılmış bir tane de dahil olmak üzere istediğiniz film şeridine ayarlayın.


3

Tıpkı bununla ilgili sorunumu yaşayanlara hızlı bir not aldım:

Benim sorunum:

Film şeridi içeriği, eklediğim yeni bir tahta dosyasına güzelce kopyalandı. Ancak, sağlanan iPad'imde değişiklik yapmaz. Oluşturma hedefi (resme bakın) için belirlenmiş film şeridi üzerinde geçiş yapmam gerektiğini fark ettim.

Puanlar olsaydı bir resim gönderirim, ancak ayar şurada bulunur:

Sol taraftaki kaynak menüde proje gezgini, proje (orta bölme) genel sekmesinin kök hedefi, (ikinci alt başlık) dağıtım bilgileri, iPad düğmesi sekmesi seçili olarak.

Oradan, film şeridinizi "ana arayüz" altında seçin.

Yazı için teşekkürler, umarım bu söz bir yere bir engel yardımcı olur.


3

Sadece eğlence için, XCode 5.1 ve iOS 7.1'de "toolVersion" ve "systemVersion" değerlerini de şu şekilde değiştirmem gerekiyordu:

toolsVersion="5023" systemVersion="13A603"

Bu olmadan, yeni film şeridi dosyası derlenmez


3

XCode6 Boyut Sınıflarını kullanarak artık film şeridini iPad'e dönüştürmenize gerek yok. Aynı Storyboard hem iPhone hem de iPad için kullanılabilir, böylece iki dosyayı güncel tutmazsınız.

Ortaya çıkan film şeridi iOS7 + ile uyumludur.

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html#//apple_ref/doc/uid/TP40014436-CH6-SW1

Bir film şeridi veya xib dosyasının tüm mevcut ekran boyutlarıyla çalışmasını sağlamak için boyut sınıflarını kullanın. Bu, uygulamanızın kullanıcı arayüzünün herhangi bir iOS cihazında çalışmasını sağlar.


3

Xcode10 için

  1. Sadece çoğalt Main.storyboard

  2. Ardından, dosyaları yeniden adlandırın Main_iPad.storyboardveMain_iPone.storyboard

  3. İçinde uygun isimleri belirleyin .plist

resim açıklamasını buraya girin

4.Sadece yapılandırmak için uygun .storyboard'u seçin resim açıklamasını buraya girin


2

Bu işlev artık yerleşiktir. Örneğin, Dağıtım Bilgisi -> Cihazlar'daki proje ayarlarını iPhone'dan Universal'a değiştirirseniz, aşağıdaki iletişim kutusu görünecektir:

resim açıklamasını buraya girin


3
Xcode'da bir hata olabilir, ancak bu işi hiç yapmadım. Ortaya çıkan iPad film şeridi projeye eklenmez ve oluşturulmuş gibi görünmez.
s73v3r

2

Dün aynı sorunla karşılaştığımda bu konuyu takip ettim. İzlediğim adımlar

  1. Xcode 5.1 için, Tablo hücrelerinin yeniden kullanımı, her denetleyici için hikaye panosu kimliği sağlamak, kullanılmayan sahneleri kaldırmak gibi iPhone film şeridinin bazı temizliğini yapmak zorunda kaldım.
  2. MainStoryboard_iPhone.storyboard'u MainStoryboard_iPad.storyboard'a kopyalayın.
  3. Vi düzenleyicisi kullanarak - değişti targetRuntime="iOS.CocoaTouch"etmektargetRuntime="iOS.CocoaTouch.iPad"
  4. Kod değiştirme MainStoryboard_iPad.storyboard dan: <simulatedScreenMetrics key="destination" type="retina4"/>hiç<simulatedScreenMetrics key="destination"/>
  5. Projeyi Xcode'da açın.
  6. Dağıtım cihazlarını Evrensel olarak değiştirdi - iPhone Storyboard'u kopyalamama seçeneğini seçin.
  7. Xcode, Dağıtım Hedefini varsayılan olarak 7.1 olacak, kullanımdan kaldırılan işlevlerle ilgilenecektir.
  8. İPad Storyboard'daki yanlış yerleştirilmiş görünüm hatasını düzeltmek için - Hata veren Denetleyiciler için Çerçeve Düzeni değiştirildi.

Bu kadar .. Yardımlarınız için hepinize teşekkürler ..


1

Bunu yapmanın en kolay ve güvenilir yolu, iPad film şeridinizden yapıştırma kopyalamaktır.

  1. Yeni bir storyboard oluşturun ve buna MainStoryboard_ipad gibi bir ad verin.
  2. Projenizin Hedef özelliklerinin Özet sayfasında Cihazlar özelliğini Evrensel olarak ayarlayarak uygulamanızı Evrensel bir uygulama yapın. resim açıklamasını buraya girin
  3. İPhone film şeridinizi açın ve tümünü seçin ve kopyalayın
  4. İPad film şeridinizi açın ve yapıştırın.

Yeniden boyutlandırmaya gitmeniz gerekecek, ancak tüm film şeridini yeniden oluşturmaktan daha hızlı olabilir.


1

Boyut sınıflarını destekleyen Xcode sürümleri için gerçekten basit bir çözüm var (yazma sırasında geçerli sürüm olan Xcode 7'de test edilmiştir). Kontrol "kullanım boyutu sınıfları" bir film şeridi dosyada onay kutusunu ( Dosya Müfettiş ), onayla o diyalog olduğunu görünür. Ardından , aynı onay kutusunun işaretini kaldırın - Xcode, bu film şeridini bir iPhone veya iPad ile kullanmak isteyip istemediğinizi soracak ve içindeki ekranları uygun bir şekilde dönüştürecektir. Film şeridi dosyasını doğrudan düzenlemeye gerek yok . Hem iPad hem de iPhone için, aynı film şeridini kopyalayın ve açıklanan yöntemi kullanarak bir tane iPad ve bir tane iPhone için yapılandırın.

Ve birisi boyut sınıflarını kullanmayı önermeden önce - harika olsa da, oyunlar vb.Gibi çok özelleştirilmiş UI için daha az uygundur.


1

Farklı bir yaklaşım

  1. İPad-Storyboard'da Gezinme-Denetleyicili boş bir Görünüm-Denetleyici ekleme

  2. Class'ı iPhone için kullanılan ilk ViewController Sınıfı olarak değiştirin, "fooViewController"

  3. İlk ViewController için iPhone-Storyboard "fooViewController_storyboard_identifier" içine Storyboard-Identifier ekleyin

  4. "FooViewController.m" adresine gidin

  5. Bool ekle Değişken bool nibWasLoadForIpad=false

  6. viewDidLoad-Method'a git

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. Sorun, görünüm arka planlarının beyaz olarak ayarlanmasıdır)


0

Apple ile bir hata raporu oluşturmalısınız . Eylül 2011'den beri açık olan benim bir kopyası (10167030) diyebilirsiniz. Benim açımdan sinir bozucu olan şey, özelliğin Xcode 3'te var olmasıdır ...


0

Cevaplar için herkese teşekkürler.

Yukarıdaki adımları izledim ancak uygulamayı simülatör veya iPad'im altında çalıştırdığımda sadece iPhone storyboard'u kullanmaya devam etti.

Nedense, hedef cihazı iPhone yerine Evrensel olarak değiştirdiğimde, Xcode (v5.0) app-Info.plist dosyasını iPad film şeridini içerecek şekilde güncellemedi, bu nedenle aşağıdaki girişi manuel olarak eklemek zorunda kaldım ( Xcode'daki plist editörünü kullanarak):

Ana film şeridi dosya temel adı (iPad) ==> MainStoryboard_iPad


0

Sadece değiştiriyorum (ek olarak @tharkay'ın cevabına):

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

ve harika çalışıyor!

Bunu XCode 8.3.3'te kullanıyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.