保存 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]];
我有一个应用程序,其中有一个 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]];