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

218

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

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

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

dehlen
источник
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-файл, но все может быть нарушено.

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

tharkay
источник
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. Create New Storyboard file with MainStoryboard_iPad.storyboard
2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
Кирит Вагела
источник
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 для любой понравившейся вам раскадровки, включая скопированную и переименованную, если хотите.

AMAN77
источник
3

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

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

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

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

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

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

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

dgetzin
источник
3

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

toolsVersion="5023" systemVersion="13A603"

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

TooManyEduardos
источник
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 и вставьте.

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

mcohen75
источник
1

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

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

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

Дэвид из студии.201
источник
0

Вы должны создать отчет об ошибке с Apple. Можно сказать, что это мой дубликат (10167030), который был открыт с сентября 2011 года. С моей точки зрения, неприятно то, что эта функция существовала в Xcode 3 ...

Стивен Дарлингтон
источник
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

Бето
источник