ページビューでスクロールビューを実装して、一部の画像(グラフ)をフルページ(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に置き換えました。スクロールがまだ遅い場合でもアプリケーションはクラッシュしません。 – Corrado
私の答えに記載されているようにイメージを読み込みますか? 「スクロールが遅い」とはどういう意味ですか?新しい画像がロードされているときに1ミリ秒間スクロールが停止することはありますか?それとも、一度に1つの画像しかスクロールできないのですか? – joern
私は画像間の遷移が遅いと思われることを意味します。画像のサイズを1024x768に縮小しました。画像が大きすぎます(2048x1539(250Kb)の画像が大きすぎますか?)。私はまた、あなたの第2の解決策を理解しようとしていますが、それは私には分かりません(これは私の最初のアプリです!)。 – Corrado