2015-12-07 3 views
0

Моя цель - установить UIView в конце (справа внизу) UIScrollView. Я видел решение с использованием UIContentSize, но я не хочу использовать это свойство, потому что оно не адаптировано: ширина UIView не равна UIScrollview contentSize.Поместите вид в конец UIScrollview - Swift

UIView - это подпрограмма UIScrollView, и мне нужно только прокручивать ее по горизонтали. Я думаю, что я должен использовать ограничения для того, чтобы придерживаться UIView в конце UIscrollview (это означает, что UIView Right сторона такая же, что и правая сторона UIScrollView, оба имеют одинаковую высоту).

Что я нахожу:

let horizontalConstraint = NSLayoutConstraint(item: self.myView , attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView , attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0) 

self.myScrollView.addConstraint(horizontalConstraint) 

let verticalConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0) 

self.myScrollView.addConstraint(verticalConstraint) 

Я немного смущен и зациклился на том, как установить эти ограничения, я, вероятно, ошибаюсь, потому что мое представление больше не отображается. Нужно ли мне определять все ограничения или только одно для правильного и одно для верхнего? Любой совет ? Благодаря

EDIT: Решение, которое я хочу, может быть представлена ​​следующим образом: enter image description here

+0

Когда вы говорите «в конце» UIScrollView, вы имеете в виду, что появляется, когда прокрутка вниз, или он остается на экране плавающим над Scrollview? Я предполагаю, что первый. Поэтому 'myView' должен быть подзаголовком' myScrollView'. Кроме того, ваше текущее вертикальное ограничение привязано к вершине, а не к нижней. – Tim

+0

Привет @Tim, конечно, UIView является подпунктом UIScrollview; Я хочу, чтобы при запуске приложения пользователь отображал uiview в конце scrollview, что означает, что пользователь может прокручивать влево, но не направо (неважно, сколько он/она может прокрутить влево) – Jibeee

+0

Понял, не понимал, что вы прокручиваете по горизонтали. Что еще в вашем 'scrollView'? Ты сказал, что это не появляется, я думаю, он закрыт. Каким бы ни был вид остальной части содержимого scrollView, необходимо ограничить левый край 'myView'. – Tim

ответ

0

UIScrollView принимает его размер содержание от его подвиды, так что это будет только больше, что она содержит. Мы не можем установить его размер независимо. Все должно быть в подчинении.

Принятие решения о размере myScrollView вы хотите:

let myViewWidth = myView.frame.width 
let myViewHeight = myView.frame.height 
let screenWidth = myScrollView.frame.width 
let scrollContentWidth = myViewWidth + screenWidth 

Создать подвид, давайте назовем его widthView

let widthView = UIView(frame: CGFloat(x: 0, y: 0, width: scrollContentWidth, height: myViewHeight)) 
myScrollView.addSubview(widthView) 

let leadingEdgeConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: myScrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(leadingEdgeConstraint) 

let trailingEdgeConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: myScrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(trailingEdgeConstraint) 

let widthContainerConstraint = NSLayoutConstraint(item: widthView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: scrollContentWidth) 
    myScrollView.addConstraint(widthContainerConstraint) 

Теперь добавьте MyView эту точку зрения:

widthView.addSubview(myView) 
myView.translatesAutoresizingMaskIntoConstraints = false 

let horizontalConstraint = NSLayoutConstraint(item: myView , attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: widthView , attribute: NSLayoutAttribute.Right, multiplier: 1, constant: 0) 
    widthView.addConstraint(horizontalConstraint) 

let heightConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: myViewHeight) 
    widthView.addConstraint(heightConstraint) 

let widthConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: myViewWidth) 
    widthView.addConstraint(widthConstraint) 
+0

И решение, которое мне кажется, это сначала добавить subview в UIScrollView, а затем установить ограничения (снизу, слева) и впоследствии изменить размер содержимого UIScrollview. Правильно ли это? – Jibeee

+0

Я полагаю, что это может сработать. Я не понимаю никакой логической причины, по которой вы хотели бы разрешить прокрутку влево, не имея там никакого контента. Цель scrollview - отображать контент. – Tim

+0

Я рисую это быстро, чтобы показать вам проблему (также обновление в моем вопросе). Индикатор в верхнем правом углу указывает значения диаграммы.Вот почему я хочу, чтобы мой вид (содержащий диаграмму) застрял на правой стороне. Зеленый квадрат представляет UIScrollView, синий - вид. http://hpics.li/d459ecc – Jibeee

0

Благодаря информации, предоставленной @Tim, я, наконец, справился с этим, не используя другой Sub Вид:

Решение:

// Create a view 

    myView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: self.myScrollView.frame.height)) 
    myView.backgroundColor = UIColor.redColor() 
    self.myScrollView.addSubview(myView) 


    // constraints 

    myView.translatesAutoresizingMaskIntoConstraints = false 


    let trailingSpaceConstraint = NSLayoutConstraint(item: self.myScrollView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: myView, attribute: NSLayoutAttribute.Trailing, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(trailingSpaceConstraint) 

    let screenWidth = self.view.frame.width 
    let leadingSpaceConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: screenWidth - 15) 
    myScrollView.addConstraint(leadingSpaceConstraint) 



    let widthConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 100) 
    myScrollView.addConstraint(widthConstraint) 

    let bottomConstraint = NSLayoutConstraint(item: self.myScrollView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.myView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(bottomConstraint) 


    let topConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(topConstraint) 

    let heightConstraint = NSLayoutConstraint(item: self.myView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: self.myScrollView, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0) 
    myScrollView.addConstraint(heightConstraint) 
Смежные вопросы