Подгонка UIScrollView к UIView

Я пытаюсь использовать UIScrollView, чтобы показать серию UIView. В моей раскадровке есть контроллер представления, содержащий UIView, ограниченный с помощью AutoLayout.

Контроллер представления (UIView серым цветом)

введите описание изображения здесь

Чтобы вызвать UIScrollView, я использую следующий метод:

func initScrollview() {

    self.mainScrollView = UIScrollView(frame: self.mainView.bounds)
    self.mainScrollView!.contentSize = CGSizeMake((self.mainView.bounds.width)*CGFloat(3), self.mainView.frame.height)
    self.mainScrollView!.backgroundColor = UIColor.greenColor() // For visualization of the UIScrollView
    self.mainScrollView!.pagingEnabled = true
    self.mainScrollView!.maximumZoomScale = 1.0
    self.mainScrollView!.minimumZoomScale = 1.0
    self.mainScrollView!.bounces = false
    self.mainScrollView!.showsHorizontalScrollIndicator = true;
    self.mainScrollView!.showsVerticalScrollIndicator = false;
    self.mainScrollView!.delegate = self

    for i in 0...3 {

        var tempView = SubView(frame: self.mainView.bounds)

        pages.insert(tempView, atIndex: i)
        self.mainScrollView!.addSubview(pages[i]);
    }

    self.mainScrollView!.scrollRectToVisible(CGRectMake(mainScrollView!.frame.size.width, 0, mainScrollView!.frame.size.width, mainScrollView!.frame.size.height), animated: false)
}

Когда я запускаю свой код, UIScrollView не подходит для UIView. Вместо этого он слишком короткий и слишком широкий. Результат выглядит так:

UIView серым цветом, UIScrollView зеленым

введите описание изображения здесь

Что я делаю неправильно, из-за чего размер UIScrollView имеет неправильный размер?


person tjlsmith    schedule 12.01.2016    source источник
comment
Где вы разместили initScrollview?   -  person tuledev    schedule 13.01.2016
comment
У меня есть initScrollView в viewDidLoad () после super.ViewDidLoad (). Я только что заметил, что если я напечатаю ширину mainView в viewDidLoad (), я получаю 536.0, а если я распечатываю ширину в viewDidAppear (), я получаю 311.0. Ожидается ли это и может ли это быть источником моей проблемы?   -  person tjlsmith    schedule 14.01.2016
comment
да. Посмотри на мой ответ :)   -  person tuledev    schedule 14.01.2016


Ответы (3)


Вы должны поместить коды, которые вы инициируете для размеров элементов пользовательского интерфейса, исходя из размера экрана (UIView из UIViewController) в viewDidLayoutSubviews. Потому что в viewDidLoad размер экрана еще не настраивался,

person tuledev    schedule 14.01.2016

В приведенном выше коде нет упоминания о добавлении mainScrollView в mainVew.

В чье представление вы добавляете mainScrollView? Я считаю, что вы пытаетесь добавить его в self.view, тогда как он должен быть в self.mainView.

После вызова функции initScrollView () попробуйте добавить к ней приведенный ниже код.

self.mainView.addSubview(mainScrollView!)
person Amey Tavkar    schedule 13.01.2016
comment
Я добавил ваш код, и это частично устранило мою проблему. mainScrollView расположен правильно, но размер по-прежнему неверен. Я заметил одну вещь: я вызываю initScrollView () в viewDidLoad (). Если я напечатаю ширину mainView в этой функции, я получу 536.0, но если я напечатаю ее в viewDidAppear (), я получу 311.0. Может ли это быть источником моей проблемы, и ожидается ли, что mainView не изменит размер, пока не будет вызван viewDidAppear ()? - person tjlsmith; 14.01.2016

Вероятно, это было бы проще, если бы вы разместили все эти представления непосредственно в раскадровке, а не программно. Я не вижу в вашем коде ничего, что нельзя было бы сделать визуально в IB. Кроме того, если в раскадровке активна функция autoLayout, установка фреймов и размеров в коде не будет работать. (автоматический макет изменит ваши значения на следующем проходе)

person Alain T.    schedule 13.01.2016