Преобразование раскадровки с iPhone на iPad
У меня есть iPhone
приложение, которое имеет раскадровку. Теперь я хочу предоставить iPad
приложение тоже. Поэтому я спросил меня, есть ли функция, которая помогает мне конвертировать мои iPhone
раскадровка к iPad
раскадровки.
Чтобы быть конкретным:
Есть ли подобная функция или только ручной способ?
21 ответ
Я нашел своеобразное решение:
Дублируйте ваш iPhone-раскадровку и переименуйте его
MainStoryboard_iPad.storyboard
Закройте Xcode, а затем откройте этот файл в любом текстовом редакторе.
Ищи
targetRuntime="iOS.CocoaTouch"
и изменить его наtargetRuntime="iOS.CocoaTouch.iPad"
Измените код в MainStoryboard_iPad.storyboard из:
<simulatedScreenMetrics key="destination" type="retina4"/>
в<simulatedScreenMetrics key="destination"/>
Теперь сохраните все и снова откройте Xcode. IPad-Storyboard имеет то же содержимое, что и iPhone-файл, но все может быть нарушено.
Это сэкономило мне часы - надеюсь, это поможет вам
Если бы вы создали универсальный проект, по умолчанию была бы создана пустая раскадровка iPad, вам просто нужно выбрать раскадровку iPhone, выбрать все (Command+A), скопировать (Command+C) и вставить ее на раскадровку iPad. Перед компиляцией обязательно переместите точку входа с пустой раскадровки на вновь скопированную раскадровку.
Это не совсем сработало для меня. Я сделал что-то немного другое.
- Создайте новый файл раскадровки для версии iPad
- Откройте новый файл и файл, который я хочу скопировать в textwrangler (текстовый редактор)
- Копировал текст XML из старого файла в новый файл между этими тегами XML
- Первый тег
<scenes> <!--Contents View Controller-->
- Вставить сюда
- Конечные метки
</class> </classes>
Это сработало для меня. Я получил новую раскладку со всеми подключенными розетками, которая одна сэкономила мне несколько часов.
1. Create New Storyboard file with MainStoryboard_iPad.storyboard
2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
Прочитав много потоков в stackru, я обнаружил, что решение - это
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. Возможно, вам также придется изменить свои ограничения. Это все, что вы сделали.
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
Это происходит по-другому, но я смог выбрать все и скопировать в раскадровку iPad (~35 сцен) и вставить ее в раскадровку iPhone. Размеры сцены были автоматически отрегулированы. Я видел только две проблемы, мне пришлось заменить UISplitViewController (так как это всего лишь iPad), и фон по умолчанию стал прозрачным, а не серым (все еще работал над исправлением этого, без ручной установки фона для всего).
РЕДАКТИРОВАТЬ: кажется, по умолчанию фон для UITableView в инспекторе атрибутов довольно странно. Мне пришлось вручную установить фон "Групповой цвет фона табличного представления" для сгруппированных табличных представлений и "Белый цвет" для негруппированных табличных представлений. Затем он отображался как "По умолчанию" (я полагаю, поскольку он соответствовал жестко заданному значению). - На самом деле, даже проще, изменение с "Сгруппированный" на "Статический" и обратно, похоже, сбрасывает цвет по умолчанию.
Вот кое-что, что сэкономило мне часы и могло бы помочь тем из вас, кто обладает навыками Python.
Последние два месяца я создавал приложение, сосредоточенное на iPad, итерируя UX с командой.
Сегодня сфокусировался на создании версии для iPhone, выполнил шаги, описанные выше (спасибо!), Но я не хотел тогда изменять размеры всех элементов пользовательского интерфейса из размеров iPad в визуальном редакторе раскадровки.
Поэтому я написал этот маленький скрипт на языке Python для сканирования файла раскадровки на предмет x, y, ширины, высоты и масштабирования всего в соотношении 320./768. Позволил мне тогда просто сосредоточиться на тонких настройках.
Скопируйте раскадровку iPad в новый файл. (например, iPhoneStoryboard.storyboard)
Запустите приведенный ниже скрипт, указав в качестве первого параметра имя файла раскадровки.
Будет создан выходной файл с суффиксом _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()
Для Xcode10
Просто дубликат
Main.storyboard
Затем переименуйте файлы в
Main_iPad.storyboard
а такжеMain_iPone.storyboard
Установите соответствующие имена в
.plist
Так же, как быстрое замечание для тех, кто, возможно, имел мою проблему с этим:
Моя проблема:
Содержимое раскадровки красиво скопировано в новый файл доски, который я добавил. Тем не менее, это не приведет к изменениям в моем подготовленном iPad. Заметив, что мне нужно было переключить назначенную раскадровку для цели сборки (см. Изображение), чтобы отобразились изменения.
Я бы опубликовал изображение, если бы у меня были точки, но настройка находится в:
Навигатор проекта в исходном меню слева, корневая цель общей вкладки проекта (центральная панель), информация о развертывании (вторая подзаголовок) с выбранной вкладкой кнопки iPad.
Оттуда выберите раскадровку в разделе "основной интерфейс".
Спасибо за пост, я надеюсь, что это упоминание поможет где-то загвоздка.
Перейдите к своему Target Summary и измените устройства на универсальные, затем перейдите вниз и установите версию ipad для любой понравившейся вам раскадровки, включая скопированную и переименованную, если хотите.
Просто для удовольствия, в XCode 5.1 и iOS 7.1 мне также нужно было изменить значения "toolVersion" и "systemVersion" следующим образом:
toolsVersion="5023" systemVersion="13A603"
Без этого новый файл раскадровки не скомпилируется
Используя классы размеров XCode6, вам больше не нужно конвертировать раскадровку в iPad. Одну и ту же раскадровку можно использовать как для iPhone, так и для iPad, что избавляет вас от необходимости обновлять два файла.
Полученная раскадровка совместима с iOS7+.
Подробнее об этом читайте здесь: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html
Используйте классы размеров, чтобы включить раскадровку или файл XIB для работы со всеми доступными размерами экрана. Это позволяет пользовательскому интерфейсу вашего приложения работать на любом устройстве iOS.
Эта функциональность теперь встроена. Например, если изменить настройки проекта в "Сведения о развертывании -> Устройства с iPhone на Universal", появится следующий диалог:
Я следил за этой веткой, когда вчера меня поразила та же проблема. Шаги, которые я следовал
- Для Xcode 5.1 мне пришлось сделать некоторую очистку раскадровки iPhone, например, пропустить reuseIdentifiers ячеек таблицы, предоставить идентификатор раскадровки для каждого контроллера, удалить неиспользуемые сцены.
- Скопируйте MainStoryboard_iPhone.storyboard в MainStoryboard_iPad.storyboard.
- Использование редактора vi - изменено
targetRuntime="iOS.CocoaTouch"
вtargetRuntime="iOS.CocoaTouch.iPad"
- Измените код в MainStoryboard_iPad.storyboard из:
<simulatedScreenMetrics key="destination" type="retina4"/>
в<simulatedScreenMetrics key="destination"/>
- Откройте проект в Xcode.
- Изменены устройства развертывания на универсальные - выберите опцию НЕ копировать раскадровку iPhone.
- Xcode по умолчанию будет использовать Deployment Target до 7.1, позаботившись об устаревших функциях.
- Чтобы исправить ошибку неуместного представления в раскадровке iPad - Изменена структура кадра для контроллеров, выдающих ошибки.
Вот и все.. Спасибо всем за помощь..
Существует действительно простое решение для версий XCode, которые поддерживают классы размеров (протестировано в XCode 7, которая является текущей версией на момент написания статьи). Установите флажок "Использовать классы размера" в файле раскадровки (File Inspector), подтвердите, что появляется диалоговое окно. Затем снимите этот флажок - Xcode спросит вас, хотите ли вы использовать эту раскадровку с iPhone или iPad, и соответствующим образом конвертируйте экраны в нее. Нет необходимости напрямую редактировать файл раскадровки. Для iPad и iPhone просто скопируйте одну раскадровку и настройте один для iPad и один для iPhone, используя описанный метод.
И прежде чем кто-то предложит использовать классы размера - хотя они и хороши, они менее удобны для сильно настроенного пользовательского интерфейса, такого как игры и т. Д.
Я просто изменяю (дополнительно к ответу от @tharkay):
<device id="ipad9_7" orientation="landscape">
и прекрасно работает!
Я использую это в XCode 8.3.3
Самый простой и надежный способ сделать это - скопировать вставку из раскадровки iPad.
- Создайте новую раскадровку и назовите ее как MainStoryboard_ipad.
- Сделайте ваше приложение универсальным, установив для свойства "Устройства" значение "Универсальный" на странице "Сводка" свойств цели для вашего проекта.
- Откройте раскадровку своего iPhone, выберите все и скопируйте
- Откройте раскадровку iPad и вставьте.
Вам нужно будет изменить размер, но это может быть быстрее, чем воссоздание всей раскадровки.
Другой подход
Добавьте пустой View-Controller с Navigation-Controller в iPad-раскадровку
Измените класс на класс вашего первого ViewController, используемого для iPhone, "fooViewController"
Добавьте идентификатор раскадровки в раскадровку iPhone "fooViewController_storyboard_identifier" для первого ViewController
Перейти на "fooViewController.m"
Добавить bool Переменная bool
nibWasLoadForIpad=false
Идти к
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. Знайте, проблема в том, что фоновые изображения будут установлены на белый цвет)
Вы должны создать отчет об ошибке с Apple. Можно сказать, что это мой дубликат (10167030), который был открыт с сентября 2011 года. С моей точки зрения, разочаровывает то, что эта функция существовала в Xcode 3...
Спасибо всем за ответы.
Я выполнил описанные выше шаги, но когда я запускал приложение под симулятором или iPad, оно продолжало работать только с раскадровкой iPhone.
По какой-то причине, когда я изменил целевое устройство на Universal вместо iPhone, Xcode (v5.0) не обновил файл app-Info.plist для включения раскадровки iPad, поэтому мне пришлось вручную добавить следующую запись (используя редактор списков в XCode):
Основное имя файла раскадровки (iPad) ==> MainStoryboard_iPad