it-swarm.com.ru

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

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

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

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

214
dehlen

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

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

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

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

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

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

    <simulatedScreenMetrics key="destination"/>

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

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

533
tharkay

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

60
Malls

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

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

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

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

Прочитав много потоков в 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
Bharat

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

6
Ricardo Anjos

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

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

5
Symmetric

Вот кое-что, что сэкономило мне часы и могло бы помочь тем из вас, кто обладает навыками 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()
4
Chris Robertson

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

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

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

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

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

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

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

3
dgetzin

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

3
AMAN77

Используя классы размеров 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
Ciprian Rarau

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

toolsVersion="5023" systemVersion="13A603"

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

3
TooManyEduardos

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

enter image description here

2
Freddie

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

  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 - Изменена структура кадра для контроллеров, выдающих ошибки. 

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

2
Shaina Prakash

Для Xcode10 

  1. Просто дублируйте Main.storyboard 

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

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

 enter image description here

4. Просто выберите правильную раскадровку для настройки  enter image description here

2
Svitlana

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

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

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

1
mcohen75

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

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

1
David from Studio.201

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

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

1
GreatWiz

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

0
Stephen Darlington

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

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

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

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

0
Pete

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

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

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

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

0
Beto