2014-09-28 4 views
0

Поэтому я хочу использовать scrollview, а также автоматически устанавливать ширину экрана на размер экрана каждого устройства.Изменение внутреннего вида UIScrollView динамически в раскадровке Xcode 6

Итак, на iPhone 6+ и на iPhone 5 внутренний UIView, который находится внутри UIScrollView, заполнит ширину UISCrollView. Ограничения объектов в UIView и UIView должны переместить внутренний контент в соответствии с фактической конечной шириной.

Проблема, с которой я сталкиваюсь, заключается в том, что я знаю, как сделать UIScrollView подходящим для экрана, на котором он размещен, и я знаю, как создавать ограничения объектов в UIView для самого UIView, и все это похоже, работают.
НО - Я не мог узнать, как сделать UIView, содержащий содержимое, изменить его ширину, чтобы он соответствовал UIScrollView.

Ограничения по настройке не помогают между scrollView и UIView, который является непосредственным ребенком. Я думаю, что это из-за «содержание» против «кадра» обсуждения они имеют на Apple, веб-сайт»
Изменение параметров кадров в коде игнорируется (возможно, потому, что он является частью раскадровки AutoLayout):

var currSize = contentView.frame; 
currSize.size.width = UIScreen.mainScreen().bounds.width; 
contentView.frame = currSize; 

Я хочу иметь Autolayout в пределах внутреннего UIView, как описано выше,
я хочу, чтобы UIScrollView, чтобы соответствовать весь экран

Что я должен делать ??

-.> Я хочу настройте «Просмотр» на fi t размер «ScrollView», в котором он находится, но любое ограничение AutoLayout неверно настраивать (поскольку оно не применяется к размеру содержимого), а код игнорируется из-за автоматической компоновки.

Эти объекты и ограничения: enter image description here

ответ

0

Я едва могу понять ваш вопрос, но если вы спрашиваете, как вы используете автоматическую раскладку в целях прокрутки, ответ отвечает в нескольких местах, от яблока Документы SO, как быстрый поиск сказал бы вам:

Короткий вариант заключается в том, что вам необходимо привязать представление содержимого краев к родительскому прокручиванию, а также установить его высоту и ширину в соответствии с родительским прокруткой. То есть. вам нужно 6 ограничений. Auto Layout - это не простое зверь для приручения, но этот аспект действительно работает.

Edit: (в разъяснении в комментарии)

Чтобы повлиять на размер содержимого в начале или в более позднее время, вы можете использовать либо ограничения макета для этого измерения (либо ширина или высота ограничение), или (к моему чтению документов) путем реализации intrinsicContentSize в представлении содержимого. Естественно, ограничения могут быть больше, чем собственный размер содержимого.

Обратите внимание, что, как правило, проще иметь один контентный просмотр для сбора любых представлений суб-контента, поскольку это даст вам более легкий контроль над размером.По умолчанию автоматическая компоновка будет вычислять эффективный размер содержимого контента (я полагаю), добавляя вышеупомянутые внутренние размеры любых непосредственных дочерних элементов scrollview, и это проще, если у вас есть один контейнер для любых представлений субконтента.

В качестве иллюстрации у меня был вид графика, который я хотел бы эффективно разделить на две страницы или ширину устройства. Я устанавливаю ограничения сверху, справа, внизу, слева, высоте, а затем устанавливаю ширину в два раза ширину основного/прокрутки (которая сама по себе является шириной экрана). Таким образом, для моей тестовой ширины 320 ширина представления содержимого составляла 640 (минус поля и т. Д.). Я установил ограничение 2x, сначала используя IB, чтобы создать ограничения по умолчанию, а затем отредактировав свойство множителя для ограничения ширины на вкладке макета правого инспектора.

+0

Это ясно, как использовать AutoLayout в представлении, которое находится в Scrollview, также ясно, как изменить размер Scrollview, чтобы соответствовать области. Единственное, что неясно, - это изменить размер UIView, который является прямым дочерним элементом scrollView. Предположим, у вас есть UIView, что его ширина равна 320, я хочу, чтобы он растягивался, когда он отображается на других устройствах. Я знаю, как устанавливать правила для его растяжения, и я знаю, как настроить UIScrollView на растяжение, но я не знаю, какое ограничение сделает UIView для этого. – evenro

+0

Кроме того, весь код, который я пытался запустить, «setContentSize», инициализирующий кадр определенного размера, игнорируется (в Xcode 6) – evenro

+0

P.S. - Я обновил вопрос, чтобы уточнить, что я пытаюсь сделать ... – evenro

2

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

Что вы не понимаете, так это то, что ограничения между краями «содержимого» и окружающего его вида прокрутки имеют особое значение - они диктуют вид прокрутки contentSize. Они не делают то, что вы хотите - они не влияют на размер контента. Представление контента должно получить свой размер от наизнанку. Это может быть связано с его ограничениями на subviews (как бы выталкивая наружу) или на собственные ограничения ширины и высоты.

+0

Я не могу это дать, потому что я не знаю его заранее .. это зависит от размера экрана. и изменения ... – evenro

+0

@evenro: ограничение ширины/высоты экрана работает из коробки, по моему ответу, нет ничего динамического как такового. Это просто макет автомата ванили, и этот вопрос кажется дублирующим в этом Обратите внимание: –

+0

Вы _must_ знаете это заранее. Размер представления контента - это 'contentSize' прокрутки. Если вы этого не сделаете, прокрутка не будет прокручиваться. – matt

1

Так, Для решения этой проблемы несколько вещей нужно сделать (как обсуждалось в других ответах, но без доброты дает код для него другими ППЛ):

  1. The Scrollview должен иметь собственные ограничения по краям экрана.
  2. Объекты внутри внутреннего UIView должны иметь свои собственные ограничения.
  3. В коде добавьте ограничения с нужным вам размером (не удивительно, почему среда разработки Microsoft намного лучше ... никогда не приходилось добираться до такого рода вещей для простых вещей).

Код:

 // Change width 
     var strConstraintWidth = "H:[contentView(=="; 
     strConstraintWidth = strConstraintWidth + UIScreen.mainScreen().bounds.width.description; 
     strConstraintWidth = strConstraintWidth + ")]"; 

     let viewDictWidth = ["contentView":contentView]; 
     let widthConstraint:Array = NSLayoutConstraint.constraintsWithVisualFormat(strConstraintWidth, options: NSLayoutFormatOptions(0), metrics: nil, views: viewDictWidth); 
     contentView.addConstraints(widthConstraint); 

     // Check if Height constraint is necesarry 
     let contentHeight = UIScreen.mainScreen().bounds.height - (adBanner.frame.size.height + 18.0); 
     if (contentView.bounds.height < contentHeight) 
     { 
      var strConstraintHeight = "V:[contentView(=="; 
      strConstraintHeight = strConstraintHeight + contentHeight.description; 
      strConstraintHeight = strConstraintHeight + ")]"; 

      let viewDictHeight = ["contentView":contentView]; 
      let heightConstraint:Array = NSLayoutConstraint.constraintsWithVisualFormat(strConstraintHeight, options: NSLayoutFormatOptions(0), metrics: nil, views: viewDictHeight); 
      contentView.addConstraints(heightConstraint); 
     } 

     mainScrollView.contentSize = contentView.bounds.size; 
+0

Никакой код не был указан, по крайней мере, из вашего вопроса, никакого кода не было - вы могли бы сделать это с IB. –

+0

Кроме того, вы не должны напрямую устанавливать contentSize при использовании AL, и вы добавляете ограничения без первоначального удаления старых, поэтому, если код выполняется во время изменений ориентации, вы получите дубликаты/конфликтующие ограничения. –

Смежные вопросы