保存 UIScrollView 位置并在应用程序再次打开时恢复。 (Objective-C)

Save UIScrollView position and restore when app opens again. (Objective-C)

我有一个应用程序,其中有一个 UIScrollView TheoryViewController,它是 640 x 9000

鉴于内容如此之多,我希望用户能够关闭视图 (TheoryViewController),(或退出应用程序),以及何时他们重新启动应用程序并打开 TheoryViewController ,我希望 ScrollView 位置再次位于最后一个位置。

我寻找了几个选项,但要么已弃用,要么在 Swift 中。

我是 运行 Xcode 8,目标是 iOS 8 SDK。

contentOffset 保存在 NSUserDefaults 中。然后当视图再次出现时,使用 setContentOffset().

滚动到该位置
// Save.
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:NSStringFromCGPoint(self.scrollView.contentOffset) forKey:@"scrollViewOffset"];

... somewhere else in your code ...

// Restore.
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
CGPoint offset = CGPointFromString([userDefaults objectForKey:@"scrollViewOffset"]);
[self.scrollView setContentOffset:offset animated:NO]

您还需要 contentSize、contentOffset 和 zoomScale 以获得准确的输出

您可以将所有内容存储到 UserDefault 中,并在需要时再次恢复

在这里查看您如何处理 NSUserDefaults

 NSMutableDictionary *dict = [@{
                                          kZoomLevel : [NSString stringWithFormat:@"%f", self.zoomScale],
                                          kRotationDegree :[NSString stringWithFormat:@"%f", self.rotationAngle],
                                          kScrollViewContentSize : NSStringFromCGSize(self.scrollViewPhoto.contentSize),
                                          kScrollViewContentOffset : NSStringFromCGPoint(self.scrollViewPhoto.contentOffset),
                                          }mutableCopy];

你需要这样恢复它

 if (dictMainData) {

    NSString *contentSize = [dictMainData valueForKey:kScrollViewContentSize];
    if (contentSize) {
        self.contentSize = CGSizeFromString(contentSize);
        self.scrollViewPhoto.contentSize = self.contentSize;
    }

    NSString *contentOffset = [dictMainData valueForKey:kScrollViewContentOffset];
    if (contentOffset) {
        self.contentOffset = CGPointFromString(contentOffset);
        self.scrollViewPhoto.contentOffset = self.contentOffset;
    }

    NSString *strZoomLevel = [dictMainData valueForKey:kZoomLevel];
    if ([strZoomLevel floatValue] > 0) {

        self.zoomScale = [strZoomLevel floatValue];
        self.viewBase.transform = CGAffineTransformMakeScale(self.zoomScale,[strZoomLevel floatValue]);

        CGRect frame = self.viewBase.frame;
        frame.origin = CGPointMake(0, 0);
        self.viewBase.frame = frame;
    }

    NSString *strRotationDegree = [dictMainData valueForKey:kRotationDegree];
    if ([strRotationDegree floatValue] > 0) {

        self.rotationAngle = [strRotationDegree floatValue];
        self.imageView.transform = CGAffineTransformMakeRotation(self.rotationAngle * M_PI/180);

        //[self rotateTargetPointsAsPerRotationAngle];
    }

 }

UserDefaults

中保存当前 offset
CGPoint tableOffset = [tableView contentOffset];

NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:NSStringFromCGPoint(tableOffset) forKey:@"pointPosition"];
[userDefaults synchronize];

要滚动到保存的位置:

CGPoint thePoint = CGPointFromString([userDefaults objectForKey:@"tableOffset"]);
[tableView setContentOffset:thePoint animated:NO]];