【问题标题】:Save UIScrollView position and restore when app opens again. (Objective-C)保存 UIScrollView 位置并在应用再次打开时恢复。 (目标-C)
【发布时间】:2018-01-11 05:37:21
【问题描述】:

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

鉴于它的内容太多,我希望用户能够关闭视图(TheoryViewController),(或退出应用程序),并在他们重新启动应用程序并打开时 TheoryViewController ,我想让 ScrollView 的位置再回到最后一个位置。

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

我正在运行 Xcode 8 并针对 iOS 8 SDK。

【问题讨论】:

标签: ios objective-c xcode uiscrollview scrollview


【解决方案1】:

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]

【讨论】:

  • 谢谢。你能告诉我代码吗?我对此很陌生。
  • @SamGuichelaar 如果是这样,请选择答案:-)
  • @SamGuichelaar Graag gedaan!我也是荷兰人:-)
【解决方案2】:

将当前的offset 保存到UserDefaults

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]];

【讨论】:

    【解决方案3】:

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

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

    在此处查看如何处理 NSUserDefaults https://stackoverflow.com/a/4562488/4601900

     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];
        }
    
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多