gpt4 book ai didi

ios - 图像 ScrollView 崩溃

转载 作者:行者123 更新时间:2023-11-29 13:36:00 25 4
gpt4 key购买 nike

我已经实现了一个带有分页的 ScrollView ,可以在整页的一些图像(图形)之间滚动(就像 iPhone 中安装的照片应用程序)。

我发现下面的代码使用了经典的 3 页解决方案(我对我的应用程序做了一些小修改)但是,即使它“有效”,滚动似乎也很慢,而且经常在我滚动一些图像后应用程序崩溃。

我正在使用启用了 ARC 选项的 Xcode 4.2,并在 iPad 设备上进行了测试。图片 (10 jpg) 为 2048x1539,每张平均尺寸为 200/250Kb。

有没有人可以帮我找出问题的原因?

谢谢,科拉多

const int numImages = 10;
const float kPageWidth = 1024.0f;
const float kPageHeight = 768.0f;


- (void)viewDidLoad {
[super viewDidLoad];

scroll.contentSize = CGSizeMake(kPageWidth * numImages, kPageHeight);
imageview1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kPageWidth, kPageHeight)];

imageview2 = [[UIImageView alloc] initWithFrame:CGRectMake(kPageWidth, 0, kPageWidth, kPageHeight)];

imageview3 = [[UIImageView alloc] initWithFrame:CGRectMake(kPageWidth * 2, 0, kPageWidth, kPageHeight)];

scroll.contentOffset = CGPointMake(0, 0);

[imageview1 setImage:[UIImage imageNamed:@"grafico_0.jpg"]];
imageview1.contentMode = UIViewContentModeScaleAspectFit;
[imageview1 setTag:1];

imageview2.contentMode = UIViewContentModeScaleAspectFit;
[imageview2 setTag:2];

imageview3.contentMode = UIViewContentModeScaleAspectFit;
[imageview3 setTag:3];

[scroll addSubview:imageview1];
[scroll addSubview:imageview2];
[scroll addSubview:imageview3];
}


- (void)scrollViewDidScroll:(UIScrollView*)scrollView {

const CGFloat currPos = scrollView.contentOffset.x;
const NSInteger selectedPage = lroundf(currPos * (1.0f / kPageWidth));
const NSInteger zone = 1 + (selectedPage % 3);
const NSInteger nextPage = selectedPage + 1;
const NSInteger prevPage = selectedPage - 1;

/// Next page
if (nextPage < numImages)
{
NSInteger nextViewTag = zone + 1;
if (nextViewTag == 4)
nextViewTag = 1;

UIImageView* nextView = (UIImageView*)[scrollView viewWithTag:nextViewTag];
nextView.frame = (CGRect){.origin.x = nextPage * kPageHeight, .origin.y = 0.0f, kPageHeight, kPageWidth};

NSString *str = [NSString stringWithFormat:@"grafico_%d.jpg", nextPage];
UIImage* img = [UIImage imageNamed:str];
nextView.image = img;
}


/// Prev page
if (prevPage >= 0)
{
NSInteger prevViewTag = zone - 1;
if (!prevViewTag)
prevViewTag = 3;

UIImageView* prevView = (UIImageView*)[scrollView viewWithTag:prevViewTag];
prevView.frame = (CGRect){.origin.x = prevPage * kPageHeight, .origin.y = 0.0f, kPageHeight, kPageWidth};

NSString *str = [NSString stringWithFormat:@"grafico_%d.jpg", prevPage];
UIImage* img = [UIImage imageNamed:str];
prevView.image = img;
}

}

最佳答案

您不应该使用 imageNamed: 来加载您的大图像,因为该方法会缓存图像并且应该只用于您在应用程序中多次使用的小图像(例如图像按钮等)。该方法因在处理许多大图像时会导致内存问题而臭名昭著。

改用 imageWithContentsOfFile:。使用该方法加载图像可确保图像不会被缓存,并且在您不再使用该图像后会释放内存。

如果滚动看起来很慢,您可以使用 performSelectorInBackground 将图像的加载移动到后台线程:

[self performSelectorInBackground:@selector(retrieveImageData:) withObject:imagePath];

UIImage 的加载发生在这个方法中:

- (void)retrieveImageData:(NSString *)imagePath {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
[self performSelectorOnMainThread:@selector(imageDataRetrieved:) withObject:image waitUntilDone:NO];
[pool release];
}

以及将图像附加到主线程上的 UIImageView(UI 操作不得发生在后台线程上):

- (void)imageDataRetrieved:(UIImage)*image {
yourImageView.image = image;
}

关于ios - 图像 ScrollView 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com