2015-12-07 21 views
0

我的目標是在UIScrollView的末尾(右下角)設置一個UIView。我看到了使用UIContentSize的解決方案,但我不想使用這個屬性,因爲它不適用:UIView的寬度不等於UIScrollview的contentSize。在UIScrollView的末尾放置一個視圖 - Swift

UIView是UIScrollView的子視圖,我只需要水平滾動。我認爲我必須使用約束才能將我的UIView粘貼在UIscrollview的末尾(這意味着UIView右側與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) 

我有點困惑,並堅持如何設置這個約束,我可能是錯誤的,因爲我的觀點不再顯示。我是否需要定義所有的約束條件,或者只有右邊的和頂部的約束條件?有什麼建議?由於

編輯: 我想該解決方案可以被這樣表示:enter image description here

+0

當你說「底」的的UIScrollView的,你的意思是滾動到頁面底部時,它的出現,或者停留在屏幕浮動在滾動視圖?我假設前者。所以'myView'應該是'myScrollView'的子視圖。此外,您目前的垂直限制被固定在頂部,而不是底部。 – Tim

+0

Hi @Tim,當然UIView是UIScrollview的子視圖;我想要的是當用戶啓動應用程序時,它會在滾動視圖的末尾顯示uiview,這對我來說意味着用戶可以向左滾動但不向右滾動(不管他有多少/她可以滾動到左側) – 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

而我看來的解決方案是首先將子視圖添加到UIScrollView,然後設置約束(Bottom,Left),然後更改UIScrollview的內容大小。這是對的嗎? – Jibeee

+0

我想這可能會起作用。我不明白你爲什麼要在沒有任何內容的情況下允許滾動到左側的任何邏輯原因。滾動視圖的目的是顯示內容。 – Tim

+0

我畫這個很快,告訴你這個問題(也在我的問題更新)。右上角的指示器指示條形圖的值。這就是爲什麼我希望我的View(包含圖表)卡在右側。綠色方塊表示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) 
相關問題