Slide 26
Slide 26 text
extension InfiniteLoopHeaderView: UIScrollViewDelegate {
…
// DeceleratingͷରԠ
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// εΫϩʔϧҐஔͷਖ਼نԽ͕ߦΘΕ͍ͯͳ͍߹
guard scrollNormalizedPosition != 0 else {
return
}
// ίϯςϯπͷதԝҐஔΛऔಘ
let scrollViewCenter = scrollView.superview!.convert(scrollView.center, to: contentView)
// தԝҐஔؚ͕·ΕΔۣܗใΛݩʹϔομʔཁૉͷΠϯσοΫεΛܭࢉ
var targetIndex: Int = -1
for index in 0..<(leftOverrun + elementCount + rightOverrun) {
let hitTestRect = CGRect(origin: CGPoint(x: CGFloat(index) * scrollView.bounds.width, y: 0),
size: scrollView.bounds.size)
if hitTestRect.contains(scrollViewCenter) {
targetIndex = index
}
}
// ಘΒΕͨΠϯσοΫεΛݩʹΠϯσοΫεใΛਖ਼نԽ
let position = targetIndex - leftOverrun
let loopIndex = (elementCount + ( (position) % elementCount)) % elementCount
selectedIndex = loopIndex
// ͜͜ͰεΫϩʔϧॲཧΛϓϩςΫτ͢Δ(scrollNormalizedPosition͕มߋ͞Εͯ͠·͏ՄೳੑΛආ͚ΔͨΊ)
skipDidScroll = true
self.scrollView.contentOffset = CGPoint(x: self.scrollView.bounds.width *
CGFloat(centerForFiniteLoop() + selectedIndex), y: 0)
skipDidScroll = false
scrollNormalizedPosition = 0
centerXConstraint.constant = 0
}
}