In meiner Bildlaufansicht möchte ich die aktuell angezeigte Seite abrufen (möglicherweise ist die Seite nicht der korrekte Begriff). Ich kann keine Variable finden, die dies enthält. Ich denke, es muss irgendwo aufbewahrt werden, da der Indikator anzeigen kann, welche Unteransicht der Bildlaufansicht gerade angezeigt wird.
Ist das vor uns verborgen oder gibt es eine Möglichkeit für mich, darauf zuzugreifen?
Für die aktuelle Seite gibt es keine UIScrollView
-Eigenschaft. Sie können es berechnen mit:
int page = scrollView.contentOffset.x / scrollView.frame.size.width;
Wenn Sie zur nächsten Seite auf- oder abrunden möchten, verwenden Sie:
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
Ich empfehle Ihnen ziemlich, diesen Code zu verwenden
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
wenn Sie diesen Code verwenden, muss Ihre Ansicht jedoch nicht genau auf der Seite sein, die indexOfPage Ihnen gibt .. _, weil ich Ihnen auch empfehle, diesen Code nur in dieser Methode zu verwenden
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
dies wird aufgerufen, wenn Ihr ScrollView abgeschlossen ist und die Nummer Ihrer Seite wirklich scharf ist
Ich empfehle Ihnen, Ihre scrollView auf paging zu setzen, die mit diesem Code aktiviert ist
[scrollView setPagingEnabled:YES];
Endlich sollte es so aussehen
-(void) methodWhereYouSetYourScrollView
{
//set scrollView
[scrollView setPagingEnabled:YES];
scrollView.delegate = self;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
//your stuff with index
}
In Swift würde ich es in Erweiterung tun:
extension UIScrollView {
var currentPage:Int{
return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
}
}
Dann rufen Sie einfach an:
scrollView.currentPage
Wie oben aber als Kategorie
@interface UIScrollView (CurrentPage)
-(int) currentPage;
@end
@implementation UIScrollView (CurrentPage)
-(int) currentPage{
CGFloat pageWidth = self.frame.size.width;
return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}
@end
Hier gibt es schon einige gute Antworten. Für Szenarien, in denen Inhalt nicht genau in eine Seite passt - und wenn Sie wie ich das Ergebnis für eine UIPageControl
verwenden möchten, müssen Sie unbedingt die Funktion ceil
verwenden.
Nehmen wir ein Beispiel, wo ich "vier und ein bisschen" Seiten mit Inhalten habe.
Ich stütze mich auf mein aktuelles Beispiel aus dem wirklichen Leben. Die Breite der Inhaltsgröße beträgt 3140 Punkte. Basierend auf der Größe meiner Kollektionsansicht beträgt die Seitenbreite 728.
Die Anzahl der Seiten ist also gleich:
3140 / 728 = 4.313
Meine numberOfPages
wird fünf sein. Vier davon werden vollständig angezeigt, und die letzte davon - Seite fünf - zeigt den verbleibenden 0.313
des Inhalts.
Nun bedeutet numberOfPages
fünf, dass die Seitenindizes 0, 1, 2, 3 und 4 sind.
Wenn ich nach rechts streife und zum endgültigen Versatz blättere, ergibt die scrollViewDidEndDecelerating
-Methode einen endgültigen X-Versatz von 2412.
Anwendung der Rundungsberechnung:
2412 / 728 = 3.313 then rounded = 3
Das ist falsch. Der Seitenbenutzer wird durch Versatz angezeigt.
Offset / Page User Is Viewing
0 0
728 1
1456 2
2184 3
2412 4
Die korrekte Berechnung mit ceil
:
private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int
{
let page = Int(ceil(offset / width))
NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ")
return page
}
Teilen Sie einfach den aktuellen Versatz durch die Seitengröße:
CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
Ein anderer Weg :
extension MyViewController: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let width = scrollView.frame.width
let page = Int(round(scrollView.contentOffset.x/width))
print("CurrentPage:\(page)")
}
}
In xCode 7.x Swift 2.x können Sie Folgendes tun:
//MARK: - ScrollView Extensions
// Get the current page number
extension UIScrollView {
var currentPage: Int {
return Int(round(self.contentOffset.x / self.bounds.size.width))
}
// If you have reversed offset (start from contentSize.width to 0)
var reverseCurrentPage: Int {
return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1
}
}
Die Lösung von Aoakenfo ist erstaunlich, dies ist eine weitere Lösung, die Ihren Code mit der Funktion scrollViewDidScroll und PageController kombiniert
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (sender == self.scroll) {
int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width);
self.pagecontroller.currentPage =pageNum;
}
}
Ich habe das aus ein paar unserer Apps extrahiert ...
- (NSInteger)currentPage
{
if (0 == self.frame.size.width) {
NSLog(@"frame width == 0!");
return 0;
}
if (! self.currentPageValid) {
_currentPage = round(self.contentOffset.x / self.frame.size.width);
self.currentPageValid = YES;
}
return _currentPage;
}
Für Swift würde ich das einfach verwenden
let width = scrollView.frame.width
let page = round(scrollView.contentOffset.x/width)
Es ist ziemlich einfach: Es nimmt im Wesentlichen die x-Position der Bildlaufansicht, teilt sie durch die Breite der Bildlaufansicht und rundet sie dann.
Verwenden Sie ein UIPageControl? Wenn ja, hat dies eine currentPage
-Eigenschaft. Wenn nicht, denke ich, müssen Sie den Seitenindex aus dem ScrollView-Offset berechnen.
Wenn Sie nach einer Möglichkeit suchen, in X für Xamarin zu arbeiten
public int CurrentIndex
{
get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
}
Dieser Getter und Setter sollten die aktuelle Seite bereitstellen und zum Blättern zu der angegebenen Seite führen