视图不粘在顶部(不改变位置)

Posted

技术标签:

【中文标题】视图不粘在顶部(不改变位置)【英文标题】:View does not stick on top (does not change position) 【发布时间】:2016-09-17 13:26:25 【问题描述】:

我试图在滚动时将 UIView 粘贴在顶部。尝试使用*** 上建议的 max(x:T, y:T) 方法,但它不起作用。我设法检测到何时应该重新定位滚动视图,但更新框架没有任何影响。

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





条件匹配成功,如Logs 所示。但观点不变。我需要 objectView 滚动一点.. 从 y=270 左右滚动到 0 .. 但不能超出它。

【问题讨论】:

如果您需要 objectView 在 scrollView 滚动时保持原样,而不是使其成为 scrollView 的子视图,为什么不改为使它们成为兄弟视图(即,使 objectView 成为 viewController 视图的子视图与滚动视图一起)?例如,当我尝试在表格视图上实现搜索栏时,这就是我所做的事情 - 一般来说,我发现它更简单! @Sparky - 我需要 objectView 从 y=270 左右滚动到 0 .. 但不能超过它。 【参考方案1】:

您需要跟踪视图在滚动视图中的原始位置,并使用该值进行计算,这是一个非常简化的示例:

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)
    

【讨论】:

在代码中创建视图时工作。不在故事板中

以上是关于视图不粘在顶部(不改变位置)的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 自定义布局页脚视图不粘在集合视图的底部

如何在 UITableView 顶部添加一个一起滚动的视图,但在滚动后粘在顶部

Angular Material md-toolbar 不粘(md-scroll-shrink)

导航菜单不粘,有白色间隙[重复]

UITableview:部分标题不会自动调整全屏点击的位置

下拉菜单和单选按钮不粘