Преобразование раскадровки с iPhone на iPad


218

У меня есть iPhoneприложение, в котором есть раскадровка. Теперь я хочу предоставить iPadзаявку тоже. Поэтому я спросил меня, есть ли функция, которая помогает мне преобразовать мою iPhoneраскадровку в iPadраскадровку.

Чтобы быть конкретным:

Есть ли подобная функция или есть только ручной способ?


5
о, спасибо, я не знал, что должен был пометить их, я пометил один ответ как правильный. Я также сделал это в моих старых темах, спасибо.
Делен

1
Подробную информацию о шагах и изображениях можно найти здесь: datacalculation.blogspot.in/2014/09/…
iOS Test,

Ответы:


536

Я нашел своеобразное решение:

  1. Дублируйте свой iPhone-раскадровку и переименуйте его MainStoryboard_iPad.storyboard

  2. Закройте Xcode, а затем откройте этот файл в любом текстовом редакторе.

  3. Найдите targetRuntime="iOS.CocoaTouch"и измените его наtargetRuntime="iOS.CocoaTouch.iPad"

  4. Измените код в MainStoryboard_iPad.storyboard из:

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

    <simulatedScreenMetrics key="destination"/>

  5. Теперь сохраните все и снова откройте Xcode. IPad-Storyboard имеет то же содержимое, что и iPhone-файл, но все может быть нарушено.

Это сэкономило мне часы - надеюсь, это поможет вам


20
+1 Если бы я мог, я бы дал вам +100 от моей собственной репутации. Гениальный совет! Единственное, что я не смог сделать, это открыть раскадровку с помощью Dashcode, поэтому я использовал TextWrangler (но я думаю, что любой текстовый редактор подойдет). Спасибо!
Петр Юстина

45
Хороший совет, спасибо. Пока вы это делаете, вы, возможно, захотите изменить все ширину = «320» на ширину = «768», высоту = «480» на высоту = «1024» и т. Д. Прямо здесь. Так как это намного проще, чем делать это поэлементно в IB.
Бен Г

63
не используйте Dashcode и textWrangler внутри xCode просто: щелкните правой кнопкой мыши раскадровку -> «открыть как» -> «Исходный код», когда закончите, сделайте то же самое, за исключением использования «Interface Builder - IOS StoryBoard»
hokkuk

16
@PiotrJustyna вы можете сделать это. Нажмите start a bountyпод вопросом, выберите желаемую сумму и Reward existing answer...
Филипп Раделик

33
чтобы получить формат iPad, также измените код в MainStoryboard_iPad.storyboard с: <simulatedScreenMetrics key="destination" type="retina4"/>на<simulatedScreenMetrics key="destination"/>
Маркуса Шваба

61

Если бы вы создали универсальный проект, по умолчанию была бы создана пустая раскадровка iPad, вам просто нужно выбрать раскадровку iPhone, выбрать все (Command + A), скопировать (Command + C) и вставить ее на раскадровку iPad. Перед компиляцией обязательно переместите точку входа с пустой раскадровки на вновь скопированную раскадровку.


9
Лучший ответ, простое решение и позволяет вам легко изменить интерфейс в отличие от верхнего ответа. :)
Мэтт Рид

как насчет макета?
попробуйKuldeepTanwar

10

Это не совсем сработало для меня. Я сделал что-то немного другое.

  1. Создайте новый файл раскадровки для версии iPad
  2. Откройте новый файл и файл, который я хочу скопировать в textwrangler (текстовый редактор)
  3. Копировал текст XML из старого файла в новый файл между этими тегами XML
  4. Первый тег <scenes> <!--Contents View Controller-->
  5. Вставить сюда
  6. Конечные метки </class> </classes>

Это сработало для меня. Я получил новый макет со всеми подключенными розетками, который сам по себе сэкономил мне несколько часов.


1
+1 другие не работали для меня, и это заставляет все работать как ожидалось
Шериф Марзук

4
Вы можете сделать это из Xcode. Просто щелкните правой кнопкой мыши по .storyboardфайлам и нажмите, Open As > Source Codeчтобы просмотреть необработанный XML.
Мэтт Кантор

8

Прочитав много потоков в stackoverflow, я обнаружил, что решение - это

1.Дублируйте свой iPhone-раскадровку и переименуйте его в MainStoryboard_iPad.storyboard

2. щелкните правой кнопкой мыши на раскадровке -> «открыть как» -> «Исходный код».

3. Найдите targetRuntime = "iOS.CocoaTouch" и измените его на targetRuntime = "iOS.CocoaTouch.iPad".

5. Найдите <simulatedScreenMetrics key="destination" type="retina4"/>и измените его на<simulatedScreenMetrics key="destination"/>

4. Теперь сохраните все и щелкните правой кнопкой мыши на MainStoryboard_iPad.storyboard «открыть как» -> «IOS StoryBoard» 5. Возможно, вам также придется изменить свои ограничения. Это все, что вы сделали.



8

1 - Создайте свой "MainStoryboard_iPad.storyboard";

2 - Щелкните правой кнопкой мыши "MainStoryboard_iPhone.storyboard"и выберите «Открыть как -> Исходный код». Скопируйте все;

3- Щелкните правой кнопкой мыши "MainStoryboard_iPad.storyboard"и выберите «Открыть как -> Исходный код». Вставь все. Теперь поиск и изменение:

  • 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 - Сохранить. Теперь снова откройте, но с помощью конструктора интерфейса. Вам нужно будет только перестроить.

Этот метод можно использовать и для файлов .xib


1
Это лучший способ сделать это. потому что все виды и компоненты будут изменены в формат ipad.
Бен

1
Нет необходимости изменять type = "com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" в последней версии ios7.
super9

5

Это происходит по-другому, но я смог выбрать все и скопировать в раскадровку iPad (~ 35 сцен) и вставить ее в раскадровку iPhone. Размеры сцены были автоматически отрегулированы. Я видел только две проблемы, мне пришлось заменить UISplitViewController (так как это только iPad), и фон по умолчанию стал прозрачным, а не серым (все еще работал над исправлением этого, без ручной установки фона для всего).

РЕДАКТИРОВАТЬ: кажется, по умолчанию фон для UITableView в инспекторе атрибутов довольно странно. Мне пришлось вручную установить фон «Групповой цвет фона представления таблицы» для сгруппированных табличных представлений и «Белый цвет» для негруппированных табличных представлений. Затем он отображался как «По умолчанию» (я полагаю, поскольку он соответствовал жестко заданному значению). - На самом деле, даже проще, изменение с «Сгруппированный» на «Статический» и обратно, похоже, сбрасывает цвет по умолчанию.


4

Вот кое-что, что сэкономило мне часы и могло бы помочь тем из вас, кто обладает навыками Python.

Последние два месяца я создавал приложение, сосредоточенное только на iPad, итерируя UX с командой.

Сегодня сфокусировался на создании версии для iPhone, выполнил шаги, описанные выше (спасибо!), Но я не хотел тогда изменять размеры всех элементов пользовательского интерфейса из размеров iPad в визуальном редакторе раскадровки.

Поэтому я написал этот маленький скрипт на языке Python для сканирования файла раскадровки на предмет x, y, ширины, высоты и масштабирования всего в пропорции 320./768. Позволил мне тогда просто сосредоточиться на тонких настройках.

  1. Скопируйте раскадровку iPad в новый файл. (например, iPhoneStoryboard.storyboard)

  2. Запустите приведенный ниже скрипт, указав в качестве первого параметра имя файла раскадровки.

  3. Будет создан выходной файл с суффиксом _adjusted.storyboard (например, iPhoneStoryboard.storyboard_adjusted.storyboard)

Надеюсь, поможет...

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
Привет, Криш, я новичок в фитоне. поэтому я не могу понять код, чтобы превратить раскадровку iphone в iPad. так что вы можете помочь мне в этом. Моя раскадровка ipad превращается в раскадровку iphone без каких-либо проблем. но мне нужно конвертировать раскадровку iphone в iPad. Так что, где требуются изменения, чтобы нуждаться в вышеупомянутом сценарии, или вы можете поделиться сценарием, который конвертирует iphone в ipad. Заранее спасибо.
Шубхам

@ Крис Робертсон Крис, если бы я хотел использовать этот скрипт для преобразования iPhone в iPad, я бы изменил «scale = 320./768». в «масштаб = 768./320.»?
Чарльз Робертсон

3

Перейдите к своему Target Summary и измените устройства на универсальные, затем перейдите вниз и установите версию ipad для любой понравившейся вам раскадровки, включая скопированную и переименованную, если хотите.


3

Так же, как быстрое замечание для тех, кто, возможно, имел мою проблему с этим:

Моя проблема:

Содержимое раскадровки красиво скопировано в новый файл доски, который я добавил. Тем не менее, это не повлияло бы на мой подготовленный iPad. Заметив, что мне нужно было переключить назначенную раскадровку для цели сборки (см. Изображение), чтобы отобразились изменения.

Я бы опубликовал изображение, если бы у меня были точки, но настройка находится в:

Навигатор проекта в меню источника слева, корневая цель общей вкладки проекта (центральная панель), информация о развертывании (вторая подзаголовок), с выбранной вкладкой кнопки iPad.

Оттуда выберите раскадровку в разделе «основной интерфейс».

Спасибо за пост, я надеюсь, что это упоминание поможет где-то загвоздка.


3

Просто для удовольствия, в XCode 5.1 и iOS 7.1 мне также нужно было изменить значения "toolVersion" и "systemVersion" следующим образом:

toolsVersion="5023" systemVersion="13A603"

Без этого новый файл раскадровки не будет компилироваться


3

Используя классы размеров XCode6, вам больше не нужно конвертировать раскадровку в iPad. Одну и ту же раскадровку можно использовать как для iPhone, так и для iPad, что избавляет вас от необходимости обновлять два файла.

Полученная раскадровка совместима с iOS7 +.

Подробнее об этом читайте здесь: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html#//apple_ref/doc/uid/TP40014436-CH6-SW1

Используйте классы размеров, чтобы включить раскадровку или файл XIB для работы со всеми доступными размерами экрана. Это позволяет пользовательскому интерфейсу вашего приложения работать на любом устройстве iOS.


3

Для Xcode10

  1. Просто дубликат Main.storyboard

  2. Затем переименуйте файлы в Main_iPad.storyboardиMain_iPone.storyboard

  3. Установите соответствующие имена в .plist

введите описание изображения здесь

4. Просто выберите правильную раскадровку для настройки. введите описание изображения здесь


2

Эта функциональность теперь встроена. Например, если изменить настройки проекта в «Сведения о развертывании» -> «Устройства с iPhone на Universal», появится следующий диалог:

введите описание изображения здесь


3
Это может быть ошибка в Xcode, но у меня никогда не было этой работы. Результирующая раскадровка для iPad не добавляется в проект, и не похоже, что она создана.
s73v3r

2

Я следил за этой веткой, когда вчера меня поразила та же проблема. Шаги, которые я следовал

  1. Для Xcode 5.1 мне пришлось сделать некоторую очистку раскадровки iPhone, например, пропустить reuseIdentifiers ячеек таблицы, предоставить идентификатор раскадровки для каждого контроллера, удалить неиспользуемые сцены.
  2. Скопируйте MainStoryboard_iPhone.storyboard в MainStoryboard_iPad.storyboard.
  3. Использование редактора vi - изменено targetRuntime="iOS.CocoaTouch"наtargetRuntime="iOS.CocoaTouch.iPad"
  4. Измените код в MainStoryboard_iPad.storyboard с: <simulatedScreenMetrics key="destination" type="retina4"/>на<simulatedScreenMetrics key="destination"/>
  5. Откройте проект в Xcode.
  6. Изменены устройства развертывания на универсальные - выберите опцию НЕ копировать раскадровку iPhone.
  7. Xcode по умолчанию будет использовать Deployment Target до 7.1, позаботившись об устаревших функциях.
  8. Чтобы исправить ошибку неуместного представления в раскадровке iPad - Изменена структура кадра для контроллеров, выдающих ошибки.

Вот и все .. Спасибо всем за помощь ..


1

Самый простой и надежный способ сделать это - скопировать вставку из раскадровки iPad.

  1. Создайте новую раскадровку и назовите ее как MainStoryboard_ipad.
  2. Сделайте ваше приложение универсальным, установив для свойства «Устройства» значение «Универсальный» на странице «Сводка» свойств цели для вашего проекта. введите описание изображения здесь
  3. Откройте раскадровку своего iPhone, выберите все и скопируйте
  4. Откройте раскадровку iPad и вставьте.

Вам нужно будет изменить размер, но это может быть быстрее, чем воссоздание всей раскадровки.


1

Существует действительно простое решение для версий Xcode, которые поддерживают классы размеров (протестировано в Xcode 7, которая является текущей версией на момент написания). Проверьте в «использовать классы размера» флажок на файл раскадровки ( File Inspector ), убедитесь , что диалоговое окно , которое появляется. Затем снимите этот же флажок - Xcode спросит вас, хотите ли вы использовать эту раскадровку с iPhone или iPad, и соответствующим образом преобразовать экраны в ней. Нет необходимости напрямую редактировать файл раскадровки . Для iPad и iPhone просто скопируйте одну раскадровку и настройте один для iPad и один для iPhone, используя описанный метод.

И прежде чем кто-то предложит использовать классы размера - хотя они и хороши, они менее удобны для сильно настраиваемого пользовательского интерфейса, такого как игры и т. Д.


1

Другой подход

  1. Добавьте пустой-View-Controller с Navigation-Controller в iPad-раскадровку

  2. Измените класс на класс вашего первого ViewController, используемого для iPhone, "fooViewController"

  3. Добавьте идентификатор раскадровки в раскадровку iPhone «fooViewController_storyboard_identifier» для первого ViewController

  4. Перейти на "fooViewController.m"

  5. Добавить bool Переменная bool nibWasLoadForIpad=false

  6. Перейти к viewDidLoad-Метод

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. Знайте, проблема в том, что фоновые изображения будут установлены на белый цвет)



0

Спасибо всем за ответы.

Я выполнил описанные выше шаги, но когда я запускал приложение под симулятором или iPad, оно продолжало работать только с раскадровкой iPhone.

По какой-то причине, когда я изменил целевое устройство на Universal вместо iPhone, Xcode (v5.0) не обновил файл app-Info.plist для включения раскадровки iPad, поэтому мне пришлось вручную добавить следующую запись ( используя редактор списков в Xcode):

Основное имя файла раскадровки (iPad) ==> MainStoryboard_iPad


0

Я просто изменяю (в дополнение к ответу от @tharkay):

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

и прекрасно работает!

Я использую это в XCode 8.3.3

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.