2015-08-05 2 views
5

У меня есть вид прокрутки, вложенный внутри контроллера просмотра, который находится в контейнере. View Controller, который использует указанный класс под названием ScrollingViewController выглядит следующим образом:Ограничения и рамки автоматической компоновки iOS не работают

class ScrollingViewController: UIViewController { 

    @IBOutlet weak var scrollView: UIScrollView! //outlet for the Scroll View 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // 1) Create the two views used in the swipe container view 
     var storyboard = UIStoryboard(name: "App", bundle: nil) 
     var subOne: SubProfileOneViewController = storyboard.instantiateViewControllerWithIdentifier("subone") as! SubProfileOneViewController 
     var subTwo: SubProfileTwoViewController = storyboard.instantiateViewControllerWithIdentifier("subtwo") as! SubProfileTwoViewController 

     // 2) Add in each view to the container view hierarchy 
     // Add them in opposite order since the view hierarchy is a stack 
     self.addChildViewController(subTwo); 
     self.scrollView!.addSubview(subTwo.view); 
     subTwo.didMoveToParentViewController(self); 

     self.addChildViewController(subOne); 
     self.scrollView!.addSubview(subOne.view); 
     subOne.didMoveToParentViewController(self); 

     // 3) Set up the frames of the view controllers to align 
     // with each other inside the container view 
     var adminFrame :CGRect = subOne.view.frame; 
     adminFrame.origin.x = adminFrame.width; 
     subTwo.view.frame = adminFrame; 

     // 4) Finally set the size of the scroll view that contains the frames 
     var scrollWidth: CGFloat = 2 * self.view.frame.width 
     var scrollHeight: CGFloat = 262 
     self.scrollView!.contentSize = CGSizeMake(scrollWidth, scrollHeight); 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

В основном то, что происходит в том, что два View контроллеры, которые используют этот класс SubProfileOneViewController и SubProfileTwoViewController, соответственно, в настоящее время экземпляры в subOne и subTwo. Затем они добавляются в список прокрутки в виде дочерних элементов, чтобы создать интерфейс, в котором пользователь может прокручивать прямо, чтобы получить доступ к другому виду (почти как Snapchat). subOne и subTwo должны быть бок о бок, и пользователь должен иметь возможность переходить от одного к другому и наоборот.

Вот что все это выглядит как на моей раскадровки: enter image description here

SubProfileOneViewController и SubProfileTwoViewController имеют вид (в лице зеленого и красного цвета, соответственно) и имеют те же самые точные ограничения, которые: высота = 262, волоча space to superview = 0, Ведущее пространство для супервизора = 0, Верхнее пространство для супервизора = 0

В идеале при запуске должно быть два вида, один зеленый и один красный, и пользователь должен иметь возможность прокручивать между ними , Однако, вот что на самом деле происходит: enter image description here

зеленый и красный вид не занимают всю ширину экрана, а вместо этого конденсируются в небольшой полоске на левой стороне, и большинство View Controllers белые вместо их соответствующий цвет. Я пробовал много вещей, и я не уверен, что я делаю неправильно.

(кредит для кода в ScollingViewController идет к lbrendanl на GitHub, связаны здесь: https://github.com/lbrendanl/SwiftSwipeView)

+0

какие ограничения вы использовали для просмотра контейнеров внутри scrollview. можете ли вы опубликовать образец проекта? –

+0

Я бы добавил один UIView (contentView) в ваш 'UIScrollView'. Затем добавьте представления дочернего контроллера в представление содержимого. Добавьте ограничения для ваших дочерних представлений, которые привязывают их верхнюю и нижнюю к представлению содержимого. Для просмотра одного, закрепите ведущий к представлению содержимого, затем закрепите его трейлинг для просмотра двух ведущих. Наконец, вы увидите два вывода, идущие к представлению содержимого. Чтобы заставить ширины быть правыми, вам нужны ограничения для ширины для просмотра одного и просмотреть два: или добавить ограничение ширины для contentView, чтобы быть x2 на экране, и добавить ограничения для просмотра одного и просмотреть два с одинаковой шириной. –

ответ

2

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

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

(испытано, построенный, связаны между собой и побежал):

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // 3) Set up the frames of the view controllers to align 
    // with each other inside the container view 
    var adminFrame = self.view.frame 
    subOne.view.frame = adminFrame 
    adminFrame.offset(dx: self.view.frame.width, dy: 0) 
    subTwo.view.frame = adminFrame; 

    // 4) Finally set the size of the scroll view that contains the frames 
    let scrollWidth = 2 * self.view.frame.width 
    self.scrollView!.contentSize = CGSizeMake(scrollWidth, self.view.frame.height) 
} 

Вот скроллинг (в действии). Обратите внимание, что я создал вид класса ViewLayoutAssistant.swift, который позволяет очень удобно визуализировать положение + шкалу.

enter image description here

Вы также не должны сказать мнение его иерархия изменилась.Этот последний бит кода должен получить ты:

@IBOutlet weak var scrollView: UIScrollView! 
weak var subOne: SubProfileOneViewController! 
weak var subTwo: SubProfileTwoViewController! 

    self.addChildViewController(subTwo); 
    self.scrollView!.addSubview(subTwo.view); 
    self.addChildViewController(subOne); 
    self.scrollView!.addSubview(subOne.view); 
2

ScrollView с Автокомпоновка работает иначе, либо вы можете использовать только один подвид, установив translatesAutoresizingMaskIntoConstraints = true и настройка contentSize явно. Или вы установили translatesAutoresizingMaskIntoConstraints = false и дайте ему узнать об ограничении. Посетите этот link для более подробной информации

Как вы хотите как следует принять во весь экран, то вам нужно добавить AutoLayoutConstraints, что-то вроде этого

  1. Pin Greenview слева супер зрения
  2. Установить Greenview ширину такой же, как scrollViewWidth т.е. bounds.size.width (не contetnSizeWidth)
  3. Pin redView слева Greenview вправо
  4. набор redView значение ширины так же, как scrollViewWidth т.е. bounds.size.width (не contetnSize.width)
Смежные вопросы