|
|
|
private var UIViewControllerRegisteredLabel: UInt8 = 0 |
|
private var UIViewControllerScrollTitleLabel: UInt8 = 1 |
|
extension UIViewController { |
|
|
|
private var registeredLabel: UILabel? { |
|
get { |
|
return objc_getAssociatedObject(self, &UIViewControllerRegisteredLabel) as? UILabel |
|
} set (value) { |
|
objc_setAssociatedObject(self, &UIViewControllerRegisteredLabel, value, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)) |
|
} |
|
} |
|
|
|
private var scrollTitleLabel: UILabel? { |
|
get { |
|
return objc_getAssociatedObject(self, &UIViewControllerScrollTitleLabel) as? UILabel |
|
} set (value) { |
|
objc_setAssociatedObject(self, &UIViewControllerScrollTitleLabel, value, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)) |
|
} |
|
} |
|
|
|
func registerScrollLabel (scroll: UIScrollView, label: UILabel) { |
|
|
|
if let nav = navigationController { |
|
registeredLabel = label |
|
|
|
let container = UIView (frame: nav.navigationBar.frame) |
|
container.y -= UIScreen.StatusBarHeight |
|
container.clipsToBounds = true |
|
container.tag = 10 |
|
nav.navigationBar.addSubview(container) |
|
|
|
scrollTitleLabel = UILabel (frame: container.frame) |
|
scrollTitleLabel?.text = label.text |
|
scrollTitleLabel?.textColor = label.textColor |
|
scrollTitleLabel?.textAlignment = .Center |
|
container.addSubview(scrollTitleLabel!) |
|
|
|
scroll.addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil) |
|
} |
|
} |
|
|
|
public override func observeValueForKeyPath( |
|
keyPath: String, |
|
ofObject object: AnyObject, |
|
change: [NSObject : AnyObject], |
|
context: UnsafeMutablePointer<Void>) { |
|
|
|
let container = navigationController!.navigationBar.viewWithTag(10)! |
|
let scroll = object as! UIScrollView |
|
let position = scroll.convertPoint(registeredLabel!.frame.origin, toView: container) |
|
|
|
let targetY = position.y + |
|
scroll.contentInset.top - |
|
registeredLabel!.frame.size.height - |
|
scrollTitleLabel!.frame.size.height |
|
let maxY = container.frame.size.height - |
|
scrollTitleLabel!.frame.size.height |
|
|
|
let y = max (targetY, maxY) |
|
scrollTitleLabel?.frame.origin.y = y |
|
} |
|
} |
Example usage