selfAdjustsScrollViewInsets结果存储在Swift中的哪里?

时间:2017-04-28 14:31:27

标签: ios swift uitableview uiview uiscrollview

我正在创建一个UIView子类,它使用KVO来观察UITableView的contentOffset。我使用contentOffset来调整UIView子类中的子视图的大小。 automaticAdjustsScrollViewInsets导致scrollView.contentOffset为-20,这很好,但是,在我的UIView子类中' layoutSubviews,scrollView.contentOffset为0.这是我设置属性" initialContentOffset"的地方。直到后来它才被设置为-20。

这种变化发生时是否有通知的方法?换句话说,我需要能够设置属性" initalContentOffset"在父视图(或任何设置它)之后进行了此调整。

我已经检查了scrollView的contentInset属性,它全部为0。

下面是代码,下面是下载项目的链接: https://www.dropbox.com/s/0tvv33pcrikrayz/ContentOffsetTest.zip?dl=0

ViewController.swift

import UIKit

class ViewController: UIViewController {

@IBOutlet var tableView: UITableView!
@IBOutlet var someView: UIView!



override func viewDidLoad() {
    super.viewDidLoad()

    let aView = SomeView()
    aView.scrollView = self.tableView
    self.someView = aView

    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 60

 }
 }

extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 100
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.textLabel?.text = String(describing: indexPath.row)
    return cell
}
}

SomeView.swift

import UIKit

private var ContentOffsetKVO = 0
private var ContentSizeKVO = 0

class SomeView: UIView {

var view: UIView!

public var scrollView: UIScrollView? {
    didSet {
        if let view = oldValue {
            removeKVO(scrollView: view)
        }

        if let view = scrollView {
            addKVO(scrollView: view)
            updateScrollPosition()
        }
    }
}

func xibSetup() {
    view = loadFromNib()
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
}

override func layoutSubviews() {
    super.layoutSubviews()
}

func loadFromNib() -> UIView {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "SomeView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
}


override init(frame: CGRect) {
    // 1. setup any properties here

    // 2. call super.init(frame:)
    super.init(frame: frame)
    // 3. Setup view from .xib file
    xibSetup()

}

required init?(coder aDecoder: NSCoder) {
    // 1. setup any properties here

    // 2. call super.init(coder:)
    super.init(coder: aDecoder)
    // 3. Setup view from .xib file
    xibSetup()
}




deinit {
    if let scrollView = scrollView {
        removeKVO(scrollView: scrollView)
    }
}

// MARK: - KVO
private func removeKVO(scrollView: UIScrollView) {
    scrollView.removeObserver(
        self,
        forKeyPath: "contentSize",
        context: &ContentSizeKVO
    )
    scrollView.removeObserver(
        self,
        forKeyPath: "contentOffset",
        context: &ContentOffsetKVO
    )
}

func updateScrollPosition() {
    let offsetY: CGFloat = scrollView!.contentOffset.y

    print("updateScrollPosition (offsetY: \(offsetY))")
}

private func addKVO(scrollView: UIScrollView) {
    scrollView.addObserver(
        self,
        forKeyPath: "contentSize",
        options: [.initial, .new],
        context: &ContentSizeKVO
    )
    scrollView.addObserver(
        self,
        forKeyPath: "contentOffset",
        options: [.initial, .new],
        context: &ContentOffsetKVO
    )
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    switch keyPath {

    case .some("contentSize"), .some("contentOffset"):
            self.updateScrollPosition()

    default:
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    }

     }

}

1 个答案:

答案 0 :(得分:0)

看来它毕竟是在scrollView.contentInset中设置的 - 只是在稍后的时间。

 (lldb) po self.scrollView?.contentInset
▿ Optional<UIEdgeInsets>
  ▿ some : UIEdgeInsets
 - top : 20.0
- left : 0.0
- bottom : 0.0
- right : 0.0