UIScrollView 페이지 변경 검색 중
페이징 지원 UIScrollView에서 사용자가 페이지를 변경할 때 알림을 감지하거나 받을 수 있는 방법이 있습니까?
이를 통해 현재 표시 중인 페이지를 탐지하고 페이지 변경 시 일부 작업을 수행할 수 있습니다.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
static NSInteger previousPage = 0;
CGFloat pageWidth = scrollView.frame.size.width;
float fractionalPage = scrollView.contentOffset.x / pageWidth;
NSInteger page = lround(fractionalPage);
if (previousPage != page) {
// Page has changed, do your thing!
// ...
// Finally, update previous page
previousPage = page;
}
}
스크롤이 완전히 중지된 후에만 페이지 변경에 대응하는 것이 허용되는 경우에는 페이지 내에서 위의 작업을 수행하는 것이 가장 좋습니다.scrollViewDidEndDecelerating:
임 대신 scrollViewDidScroll:
방법.
페이징 가능한 스크롤 뷰에서 scrollViewDidEndDecelerating을 사용하여 보기가 페이지에 안착된 시점(같은 페이지일 수 있음)을 알 수 있습니다.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
scrollViewDidScroll
모든 움직임에 대해 호출됩니다.또한 페이징 활성화된 보기를 사용하여 다음 페이지로 이동할 수 있을 정도로 스크롤된 시점을 찾을 수 있습니다(그 시점에서 드래그가 중지된 경우).
UIScrollView 딜러의 두 가지 방법을 결합하는 것은 어떻습니까?
scrollViewDidEndDragging(_:willDecelerate:)
멈추면, 만약 한다면, , 은 만약그즉합다니면, 페계있을산면다고, 만그감것다니잡입힐그, 리는것을놓고두은것우아하속이그약것지것이다이멈에 입니다.scrollViewDidEndDecelerating(_:)
.
코드는 XCode 버전 7.1.1, Swift 버전 2.1에서 테스트되었습니다.
class ViewController: UIViewController, UIScrollViewDelegate {
// MARK: UIScrollViewDelegate
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate == false {
let currentPage = scrollView.currentPage
// Do something with your page update
print("scrollViewDidEndDragging: \(currentPage)")
}
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let currentPage = scrollView.currentPage
// Do something with your page update
print("scrollViewDidEndDecelerating: \(currentPage)")
}
}
extension UIScrollView {
var currentPage: Int {
return Int((self.contentOffset.x+ (0.5*self.frame.size.width))/self.frame.width)+1
}
}
구글에서 페이지 감지를 위한 첫 번째 결과가 나왔기 때문에 저는 제 생각에 더 나은 해결책으로 이것에 답해야 했습니다.(이 질문이 2년 반 전에 던져진 것일지라도.)
전화는 안 하고 싶어요scrollViewDidScroll
페이지 번호를 추적하기 위해서입니다.단순한 것 치고는 과잉 살상입니다.용사를 합니다.scrollViewDidEndDecelerating
작동하고 페이지 변경에서 중지하지만 사용자가 일반보다 화면을 두 번 더 빠르게 스와이프할 경우(그리고 크기는 크지만)scrollViewDidEndDecelerating
한 번만 호출됩니다.#2페이지를 처리하지 않고 #1페이지에서 #3페이지로 쉽게 이동할 수 있습니다.
이것으로 저는 완전히 해결되었습니다.
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
scrollView.userInteractionEnabled = NO;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//Run your code on the current page
scrollView.userInteractionEnabled = YES;
}
이렇게 하면 사용자는 위에서 설명한 위험 없이 한 번에 한 페이지만 스와이프할 수 있습니다.
스위프트 4
은 이를위가좋방사것용다입니는하법은은장한▁using다것▁by▁i니입▁to▁the▁is를 사용하는 것입니다.scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)
화면에서 손가락을 떼자마자 페이징이 발생할지 여부를 예측할 수 있습니다.이 예는 수평으로 페이징하기 위한 것입니다.
하세요.scrollView.delegate
채하는목적에를 채택한 에게.UIScrollViewDelegate
이 방법을 구현합니다.
var previousPageXOffset: CGFloat = 0.0
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
let targetOffset = targetContentOffset.pointee
if targetOffset.x == previousPageXOffset {
// page will not change
} else if targetOffset.x < previousPageXOffset {
// scroll view will page left
} else if targetOffset.x > previousPageXOffset {
// scroll view will page right
}
previousPageXOffset = targetOffset.x
// If you want to track the index of the page you are on just just divide the previousPageXOffset by the scrollView width.
// let index = Int(previousPageXOffset / scrollView.frame.width)
}
UIScrollView의 대리자를 구현합니다.이 방법은 당신이 찾고 있는 것입니다.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
여기 이것에 대한 빠른 해결책이 있습니다.
코드를 구현하는 클래스에서 currentPage와 previousPage 두 속성을 만들고 0으로 초기화합니다.
이제 스크롤ViewDidEndDraging(: willDecelerate:) 및 스크롤ViewDidEndDecelerating(: scrollView:)에서 currentPage를 업데이트합니다.
그런 다음 scrollViewDidEndScrolling Animation(_:scrollView:)에서 previousPage를 업데이트합니다.
//Class Properties
var currentPage = 0
var previousPage = 0
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
updatePage(scrollView)
return
}
func scrollViewDidEndDecelerating(scrollView: UIScrollView){
updatePage(scrollView)
return
}
func updatePage(scrollView: UIScrollView) {
let pageWidth:CGFloat = scrollView.frame.width
let current:CGFloat = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1
currentPage = Int(current)
if currentPage == 0 {
// DO SOMETHING
}
else if currentPage == 1{
// DO SOMETHING
}
}
func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
if previousPage != currentPage {
previousPage = currentPage
if currentPage == 0 {
//DO SOMETHING
}else if currentPage == 1 {
// DO SOMETHING
}
}
}
var scrollViewPage = 0
override func viewDidLoad() {
super.viewDidLoad()
scrollViewPage = scrollView.currentPage
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollViewPage != scrollView.currentPage {
scrollViewPage = scrollView.currentPage
// Do something with your page update
print("scrollViewDidEndDecelerating: \(scrollViewPage)")
}
}
확장 사용
extension UIScrollView {
var currentPage: Int {
return Int((self.contentOffset.x + (0.5 * self.frame.size.width)) /
self.frame.width) + 1
}
}
2019년 컷앤페이스트
이렇게 하는 것은 쉽지 않습니다.
var quantumPage: Int = -100 { // the UNIQUELY LANDED ON, NEVER REPEATING page
didSet {
print(">>>>>> QUANTUM PAGE IS \(quantumPage)")
pageHasActuallyChanged() // your function
}
}
private var possibleQuantumPage: Int = -100 {
didSet {
if oldValue != possibleQuantumPage {
quantumPage = possibleQuantumPage
}
}
}
public func scrollViewDidEndDragging(
_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate == false {
possibleQuantumPage = currentPageEvenIfInBetween
}
}
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
possibleQuantumPage = currentPageEvenIfInBetween
}
var currentPageEvenIfInBetween: Int {
return Int((self.contentOffset.x + (0.5 * self.frame.width)) / self.frame.width)
}
완벽하게 작동합니다.
pageHasActuallyChanged
사용자가 "페이지 변경"으로 간주하는 페이지를 변경할 때만 호출됩니다.
주의: 양육은 까다롭습니다.
이것은 부팅 시 초기화하기가 어려우며 페이징된 시스템을 사용하는 방법에 따라 달라집니다.
모든 페이징 시스템에서 "scrollToViewAtIndex..."
open func scrollToViewAtIndexForBringup(_ index: Int) {
if index > -1 && index < childViews.count {
let w = self.frame.size.width
let h = self.frame.size.height
let frame = CGRect(x: CGFloat(index)*w, y: 0, width: w, height: h)
scrollRectToVisible(frame, animated: false) // NOTE THE FALSE
// AND IMPORTANTLY:
possibleQuantumPage = currentPageEvenIfInBetween
}
}
따라서 사용자가 17페이지에서 "책"을 열면 상사 클래스에서 해당 기능을 불러 일으켜 "17"로 설정하게 됩니다.
이러한 예에서는 이러한 시작 함수에서 가능한 QuantumPage 값을 초기에 설정해야 합니다. 시작 상황을 처리할 수 있는 일반적인 방법은 없습니다.
결국, 예를 들어, 퀀텀 페이지 상황에서 "의미"가 무엇인지 아는 사람은 "빠른 스크롤"을 원할 수 있습니다.따라서 사용자의 상황에 따라 부팅하는 동안 퀀텀 페이지 시스템을 신중하게 초기화해야 합니다.
어떤 경우에도, 완벽한 양자 페이징을 얻기 위해 상단에 있는 5개의 함수를 복사하여 붙여넣기만 하면 됩니다.
스위프트를 위하여
static var previousPage: Int = 0
func scrollViewDidScroll(_ scrollView: UIScrollView){
let pageWidth: CGFloat = scrollView.frame.width
let fractionalPage: CGFloat = scrollView.contentOffset.x / pageWidth
let page = lround(Double(fractionalPage))
if page != previousPage{
print(page)
// page changed
}
}
언급URL : https://stackoverflow.com/questions/5272228/detecting-uiscrollview-page-change
'programing' 카테고리의 다른 글
Base64 인코딩 이미지 (0) | 2023.08.09 |
---|---|
하위 쿼리를 처리하기 위한 MariaDB 이전 버전 (0) | 2023.08.09 |
빠른 분할 테스트(2,3,4,5,...,16)? (0) | 2023.08.09 |
드롭(존재하는 경우)과 드롭(존재하지 않는 경우)? (0) | 2023.08.09 |
Excel Q - 2차원 배열이 있는 SUMIFS (0) | 2023.08.09 |