ios - View 不粘在顶部(不改变位置)

标签 ios swift uiview uiscrollview uikit

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

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 ..但不能超出它。

最佳答案

您需要跟踪 ScrollView 中 View 的原始位置,并使用该值进行计算,这是一个非常简单的示例:

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)
    }
}

关于ios - View 不粘在顶部(不改变位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39547345/

相关文章:

ios - 如何同时覆盖 initWithFrame : and initWithCoder: in subclass of UIView?

ios - UIButton Action 不在 Swift 中调用?

objective-c - iOS App 版本升级 - Bundle 内容是否被删除?

ios - 如何防止UIView通过自动布局动画到位?

swift - 在 Swift 中移动 UIImageView 的 UIImage 中的 UIView

ios - 从 UIView 子类推送导航 Controller 会导致崩溃

ios - UITableView的indexPathsForSelectedRows是否按选择顺序排序?

ios - 如何以编程方式使用 Swift 3 在所有 View Controller 中显示选项卡栏?

ios - 如何将 Skype 集成到我的 iPhone 应用程序中

cocoa-touch - 在扩展中添加便利的初始值设定项并在子类上调用它们