как сделать xib-совместимым с устройствами iphone 5 и iphone 4

<p>я пытаюсь расположить свой xib так, чтобы макет подходил как для iphone 5 (4 дюйма сетчатки), так и для 3.5 устройств. </p><p>поскольку я должен поддерживать ios-5, я не могу использовать autolayout. я должен использовать пружины и распорки.</p><p>я попробовал все в интерфейс-строитель. но либо мое мнение выходит за пределы нижней части iphone-3,5 дюйма, либо не полностью заполняет сетчатку iphone-4-inch. </p><p>может кто-нибудь подсказать, как на самом деле сделать xib совместимым с обоими устройствами?</p><p>для большей наглядности добавляю скриншоты:</p><p>когда я устанавливаю размер 3,5 в атрибуте инспектора: <img src="https://i.stack.imgur.com/rusny.png" alt="when i set size in attribute inspector to 3.5"></p><p>это выглядит в iphone-5. под кнопками есть пробел: <img src="https://i.stack.imgur.com/uxwqx.png" alt="and this is how it looks in simulator for 3.5 inch device"></p><p>если я установлю размер 4 дюйма в интерфейсе конструктора. вы можете видеть, что нижние кнопки не видны в iphone-4 . <img src="https://i.stack.imgur.com/m2to7.png" alt="if i set size 3.5 inch in interface builder"></p><p>поэтому вы спросите, какие настройки я использую. вот они:</p><p><img src="https://i.stack.imgur.com/qhqr9.png" alt="enter image description here"> <img src="https://i.stack.imgur.com/5yj37.png" alt="enter image description here"> <img src="https://i.stack.imgur.com/ctz8a.png" alt="enter image description here"></p>

<ol> <li><p>вы добавляете новую категорию для uiviewcontroller и добавляете этот код в файл .h </p> <pre><code> - (id)initwithnibnameforiphone4:(nsstring *)nibnameornil4 nibnameforiphone5:(nsstring *)nibnameornil5 nibnameforipad:(nsstring *)nibnameornilpad bundle:(nsbundle *)nibbundleornil; </code></pre></li> <li><p>добавьте этот код в ваш файл .m </p> <pre><code> - (id)initwithnibnameforiphone4:(nsstring *)nibnameornil4 nibnameforiphone5:(nsstring *)nibnameornil5 nibnameforipad:(nsstring *)nibnameornilpad bundle:(nsbundle *)nibbundleornil { if (self = [super init]) { self = [self initwithnibname:[self checkdeviceiphone4:nibnameornil4 iphone5:nibnameornil5 ipad:nibnameornilpad] bundle:nibbundleornil]; } return self; } -(nsstring *)checkdeviceiphone4:(nsstring *)iphone4 iphone5:(nsstring *)iphone5 ipad:(nsstring *)ipad { return ([uidevice currentdevice].userinterfaceidiom == uiuserinterfaceidiompad) ? ipad :([[uiscreen mainscreen] bounds].size.height == 568) ? iphone5 :iphone4; } </code></pre></li> <li><p>откройте файл youproject-prefix.pch и импортируйте свою категорию здесь </p></li> <li><p>теперь вы просто используете это во всем проекте, как это </p> <pre><code> self.firstview=[[firstview alloc]initwithnibnameforiphone4:@"firstview4" nibnameforiphone5:@"firstview" nibnameforipad:@"firstviewipad" bundle:[nsbundle mainbundle]]; </code></pre> <p>спасибо и любой вопрос, затем прокомментируйте и не забудьте upvote :-)</p></li> </ol><p>\</p>

<p>попробуйте добавить это ко всем вашим контроллерам, которые должны поддерживать iphone 5:</p><pre><code>- (void) loadview { [super loadview]; self.view.frame = [uiscreen mainscreen].bounds; } </code></pre>

<p>просто установите размер представления нет, используя interface-builder<br> он будет принимать размер представления во время выполнения, просто вам нужно позаботиться о origin и автоматическом изменении размера для каждого элемента (uilabel, uiimage и т.д.) в представлении.</p><ul> <li><strong> интерфейсный конструктор (xib) -> инспектор атрибутов -> симулированные метрики - размер: нет </strong></li> </ul><p><img src="https://i.stack.imgur.com/k9jlh.png" alt="enter image description here"></p>

<p>я боролся с этим сегодня, и что бы я ни делал, мои взгляды всегда отображались как 320x480, даже при работе на 4 "симуляторе сетчатки. даже [uiscreen mainscreen] .bounds возвращал 320x480!</p><p>я обнаружил, что добавление образа запуска default-568h@2x.png было ключом к тому, чтобы ios распознала мое приложение как «retina 4« готово ». после того, как я это сделал, я обнаружил, что больше ничего не нужно делать, чтобы автоматически настроить размер перьев. без черных полос. нет необходимости иметь два отдельных xib, изменять настройки в интерфейсном разработчике, переопределяя loadview и т. д.</p>

<p>если вы идете с решением с использованием 2 xib-файлов; в вашем методе initwithnibname () просто вызовите super с другим именем nib. </p><p>я бы протестировал исходный размер 480, а не 568, чтобы больший xib-файл был выбран, когда apple выпустит экран большего размера. в будущем, по крайней мере, большой сиб будет не столько почтовым, сколько с меньшим.</p><pre><code>// from mainview.m - (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil { cgsize result = [[uiscreen mainscreen] bounds].size; if(result.height == 480) { // iphone classic self = [super initwithnibname:@"mainview" bundle:nibbundleornil]; } else { // iphone 5 or maybe a larger iphone ?? self = [super initwithnibname:@"mainview5" bundle:nibbundleornil]; } return self; } </code></pre>

<p>вам не нужно использовать другое перо для 3,5-дюймовых и 4-дюймовых устройств. разработайте приложение для 4-дюймового устройства и правильно установите autoresizingmask, и оно должно работать правильно.</p><p>в вашем случае просто установите autoresizingmask на</p><pre><code>[view setautoresizingmask:uiviewautoresizingflexibletopmargin|uiviewautoresizingflexibleheight|uiviewautoresizingflexiblewidth]; </code></pre><p>маска авторазмера корректно размещает вид на свои позиции в обоих устройствах. </p>

<p>у меня также была проблема с 3,5 "против 4", и я неправильно понял, что было не так, поэтому я хотел документировать это здесь, чтобы это помогло кому-либо.</p><p>если вы пытаетесь получить доступ к <code>self.view.frame</code>, он не будет правильно сообщен до <code>viewdidappear</code> или какого-либо подобного события. если вы попытаетесь получить доступ к <code>self.view.frame</code> изнутри <code>viewdidload</code>, тогда вы можете сообщить о размерах фрейма<em> до </em>автоматического изменения размера.</p>

<p>у меня есть идея. позвольте разделить ваш пользовательский интерфейс на верхний и нижний колонтитулы (например, веб-сайт). затем в консоли кода найдите size inspector и используйте функцию автоматического изменения размера.</p><p>обратите внимание на внешние линии квадрата, это ваше контрольное местоположение напротив основного вида. установите элементы управления (панель навигации, uiimageview, uibutton и т.д.) в части заголовка и части тела, прикрепленной к верху, и элементы управления (закладка, закрыть и т.д.) в нижнем колонтитуле к нижнему.</p><p>каждый раз, когда вы запускаете, элементы управления будут привязаны к своим настройкам автоматического изменения размера. у вас будет пространство между верхним и нижним колонтитулами на iphone 5, но я думаю, что это нормально.</p>

<p>определите строку ниже и проверьте состояние в зависимости от устройства.</p><pre><code>#define is\_iphone\_5 ( fabs( ( double )[ [ uiscreen mainscreen ] bounds ].size.height - ( double )568 ) </pre> <pre>if (is\_iphone\_5) { btnbookmark.frame=cgrectmake(0, 460, 100, 70); btnbookmark.frame=cgrectmake(150, 460, 100, 70); } else { btnbookmark.frame=cgrectmake(0, 360, 100, 70); btnbookmark.frame=cgrectmake(150, 360, 100, 70); } </code></pre>

<p>без использования autolayout вам может понадобиться обработать много вещей в коде. я предполагаю, что большая часть вашего макета может хорошо работать с пружинами и распорками, но некоторые элементы пользовательского интерфейса не могут, поэтому просто необходимо вручную установить рамки определенных объектов в соответствии с размером вашего представления. </p>

<ul> <li>в раскадровке нажмите «показать инспектор файлов».</li> <li>под интерфейсным документом документа-> версии документа выберите deployment = ios 5 (или ваш выбор).</li> </ul><p>если это не работает, вам нужно работать с каждым из ваших представлений .... выберите их. в инспекторе атрибутов для каждого из них, в разделе «вид», см. атрибут режима. установите для этого значение «перерисовать».</p><p>если даже это не дает удовлетворительного результата, установите размер представления наименьшей из всех версий, которые вы собираетесь использовать. и установите атрибут mode = 'scale to fill'.</p><p>программно атрибутом mode является <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview\_class/uiview/uiview.html#//apple\_ref/doc/uid/tp40006816-ch3-sw99">view.contentmode</a> property.</p>

<p>приведенный выше фрагмент кода ivanzoid, в котором запрашивается весь размер экрана, делает все возможное, если вы не забываете вычитать смещения для навигации и панелей инструментов (всего 64 при большинстве условий). </p><p>это высота вида, которая должна быть отрегулирована; пружины и распорки иначе заботятся об этом. </p><p>повторное тестирование моего приложения на iphone 5 мне нужно было сделать это только на одном экране с некоторыми настройками положения во время выполнения. любой другой случай обрабатывается значениями по умолчанию xib.</p>

<p>если вы не хотите использовать два xib и хотите использовать autosizing <a href="https://www.dropbox.com/s/sfqfkk8vusqtxi0/demo.zip">здесь</a> </p>