2016-09-17 2 views
0

Ich versuche, die UIView beim Scrollen oben zu halten. Versucht mit Max (x: T, y: T) Methode, wie hier auf stackOverflow vorgeschlagen, aber es funktioniert nicht. Ich kann feststellen, wenn die scrollView neu positioniert werden sollte, aber das Aktualisieren des Rahmens hat keine Auswirkungen.Ansicht bleibt nicht oben haften (ändert nicht die Position)

import UIKit 

class ViewController: UIViewController, UIScrollViewDelegate{ 

@IBOutlet var objectView: UIView! 
@IBOutlet var scrollView: UIScrollView! 

//var originalOffsetY : CGFloat! 
//var originalOffestX : CGFloat! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    let size = CGSize.init(width: self.view.frame.width, height: self.view.frame.height*2) 
    scrollView.contentSize = size 
    scrollView.backgroundColor = UIColor.blueColor() 
    objectView.backgroundColor = UIColor.whiteColor() 
    scrollView.delegate = self 

    scrollView.addSubview(objectView) 
} 

    // override func viewWillAppear(animated: Bool) { 
    // originalOffsetY = objectView.frame.origin.y 
    // originalOffestX = objectView.frame.origin.x 

    // } 


func scrollViewDidScroll(scrollView: UIScrollView) { 

    print("ScrollView \(scrollView.contentOffset.y)") 
    print("ObjectView \(objectView.frame.origin.y)") 


    let location = CGPointMake(0, scrollView.contentOffset.y) 
    let size = objectView.frame.size 


    if scrollView.contentOffset.y >= objectView.frame.origin.y { 
     objectView.frame = CGRect.init(origin: location, size: size) 
     print("Detected \(objectView.frame)") 

    } 

    //  var newRect = objectView.frame 
    //  newRect.origin.y = max(originalOffsetY!, scrollView.contentOffset.y) 
    //  objectView.frame = newRect 


} 

} 

Die Bedingung ist erfolgreich angepasst wie hier in Logs zu sehen. Aber die Aussicht bleibt unverändert. Ich benötige die Objektansicht, um ein bisschen zu scrollen .. von etwa y = 270 bis 0 .. aber nicht darüber hinaus.

+1

Wenn Sie Object müssen gesetzt bleiben, wie scroll gescrollt Anstatt sie zu einer Unteransicht von scrollView zu machen, sollten Sie sie stattdessen zu gleichgeordneten Ansichten machen (zB make objectView eine Unteransicht der Ansicht Ihres viewControllers neben scrollview). So habe ich beispielsweise versucht, eine Suchleiste in einer Tabellenansicht zu implementieren - generell finde ich das viel einfacher! – Sparky

+0

@Sparky - Ich brauche die Objektansicht, um ein wenig zu scrollen .. von etwa y = 270 bis 0 .. aber nicht darüber hinaus. – user3626615

Antwort

0

Sie müssen innerhalb der Ansicht blättern Spur der ursprünglichen Position der Ansicht zu halten, und berechnen Sie diesen Wert verwenden, hier ist ein sehr vereinfachtes Beispiel:

class StickyScrollViewController: UIViewController { 

    var stickyView = UIView(frame: CGRect(x: 0, y: 100, width: 300, height: 100)) 
    var originalStickyOrigin: CGPoint = CGPoint(x: 0, y: 100) 

    func scrollViewDidScroll(_ scrollView: UIScrollView) { 
     var nextYOffset = max(originalStickyOrigin.y, scrollView.contentOffset.y) 
     stickyView.frame = CGRect(x: 0, y: nextYOffset, width: 300, height: 100) 
    } 
} 
+0

Funktioniert, wenn die Ansicht in Code erstellt wird. Nicht im Storyboard – user3626615

Verwandte Themen