2011-02-25 9 views

答えて

5

それはあなたがサブビューとしてUIImageViewを追加し、あなたのサブビューとscrollViewのcontentSizeの大きさを知って欲しいスペースを計算するだけで、基本的な数学..

です。

EDIT:

これは基本的に

-(void)photosGallery 
{ 
    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:(CGRect){.origin.x = 0.0f, .origin.y = 0.0f, .size.width = 320.0f, .size.height = 416.0f}]; 
    scrollView.contentSize = (CGSize){.width = view.frame.size.width, .height = 372.0f}; 
    scrollView.backgroundColor = [UIColor whiteColor]; 
    scrollView.showsVerticalScrollIndicator = NO; 
    scrollView.showsHorizontalScrollIndicator = NO; 
    /// Build gallery 
    CGSize thumbSize = (CGSize){.width = 75.0f, .height = 75.0f}; 
    const CGFloat xSpace = (scrollView.frame.size.width - (thumbSize.width * kPictsPerRow))/(kPictsPerRow + 1); // kPictsPerRow = Number of pictures in a row 
    const CGFloat xInc = thumbSize.width + xSpace; 
    const CGFloat yInc = thumbSize.height + 15.0f; 
    CGFloat x = xSpace, y = 10.0f; 
    for (NSUInteger i = kMaxPictures; i--;) 
    { 
     UIImageView* pv = [[UIImageView alloc] initWithFrame:(CGRect){.origin.x = x, .origin.y = y, .size = thumbSize}]; 
     [scrollView addSubview:pv]; 
     [pv release]; 
     x += xInc; 
     const NSUInteger eor = i % kPictsPerRow; 

     if (!eor) 
      y += yInc, x = xSpace; 
    } 
    [scrollView release]; 
} 
+0

Iは知っているが、ギャップはスクロールビューにどのように入力/追加されますか?各画像のサブビューがスクロールビューに追加されている場合、スクロールビューに適用されるこの計算はどこですか?どのように追加されますか? – jarryd

+0

@Benj:私はすべての画像を追加するときに私が持っている1つの問題は効率です。すべての画像をビューにロードするにはしばらく時間がかかります。これを行う最適な方法はありますか? – jarryd

+0

イメージの大きさはどれくらいですか?何人いるの? – Nyx0uf

3

ギャラリーを構築するには、ちょうどUIImageVIewのそれらの間にいくつかのスペースを持つためにフレームを設定する必要があります。例えばscroll_viewがUIScrollViewのある場合は、これは、粗例ですが、ポイントを示し

scroll_view.contentSize = CGSizeMake(1000,100); 
for (int i=0;i<10;i++){ 
    UIImageView *imv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"some_image.png"]]; 
    CGRect frame = CGRectInset(CGRectMake(i * 100,0.0,100.0,100.0), 5.0, 4.0); 
    imv.frame = frame; 
    [scroll_view addSubview:imv]; 
} 

行うことができます。 CGRect(CGRectInset)を挿入すると、スクロールビューで画像間にスペースができます。

0

私は同様のアプリでこれをしなければならなかった、と私の解決策は、(質問はビューをスクロールする関連していなかったことに注意してください、しかし関与概念は似ています)この回答に記載されて:PDF in UIWebView

21

私はあなたを想定しますページングを有効にしてUIScrollViewに画像を追加する方法を理解しています。また、フルスクリーンの写真を見たいと思っていますが、スクロールするときには、それらの間にギャップがあります。 yesの場合、ここで可能な解決策の一つ...

  • だ定義20ピクセル
  • UIScrollViewのようなギャップは、iPhone CGRectMakeへ
  • セットUIScrollViewのフレーム(0、0、340、480)のためのフルスクリーンビュー、320×480です。 // 340 = 320 + 20(ギャップ、これらの20ピクセルはオフスクリーンです)
  • CGRectMake(0、0、320、480)に最初のイメージフレームを設定します。
  • CGRectMake(340,0,320,480)への第2の画像フレーム。
  • ... I番目の画像CGRectMake(340 * I、0,320,480)// Iはインデックス - 0..N-1
  • を設定CGISizeMake(340 * N、480) // N =画像数

...これは、ズーミングを望んでいない場合は、フルスクリーン、ページング、ギャップをスクロールしたくない場合は非常に高速です。おそらく、このコードを探している

+1

私のような数学のnoobのための最善の答え。ありがとう! – attomos

+0

これはうまくいくように見えますが、私にとってはギャップが見えなくなっていません。何か案は? – Tim

0

#define FRAME_WIDTH 330 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, FRAME_WIDTH, self.view.bounds.size.height)]; 
    self.scrollView.bounces = YES; 
    self.scrollView.pagingEnabled = YES; 

    UIImageView *leftView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"2.png"]]; 
    leftView.frame = CGRectMake(0, 0, 320, self.view.bounds.size.height); 

    UIImageView* centerView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"9.png"]]; 
    centerView.frame = CGRectMake(FRAME_WIDTH, 0, 320, self.view.bounds.size.height); 

    UIImageView *rightView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"10.png"]]; 
    rightView.frame = CGRectMake(FRAME_WIDTH * 2, 0,320,self.view.bounds.size.height); 

    [self.scrollView addSubview:leftView]; 
    [self.scrollView addSubview:centerView]; 
    [self.scrollView addSubview:rightView]; 

    [self.scrollView setContentSize:CGSizeMake(FRAME_WIDTH * 3, 0)]; 
    [self.scrollView setContentOffset:CGPointMake(FRAME_WIDTH, 0)]; 

    [self.view addSubview:self.scrollView]; 
} 

は、iOSの写真アプリのように見えます。この例では、3つのImageViewを作成します。

テストプロジェクトを添付あなたはそれを自分で試すことができるように:Project

0

UIScrollViewののフレームをいじり避けるために、あなたはUIScrollViewのをサブクラス化し、各ページへのオフセットを適用するlayoutSubviewsをオーバーライドすることができます。

アイデアは以下の観察に基づいています!zoomScale == 1、オフセットがある場合には、それは右/左エッジ

  • にあるときzoomScale = 1、オフセットがゼロのとき

    1. ゼロは、次のコードが導出され、可視RECT中心に

    とき:

    - (void) layoutSubviews 
    { 
        [super layoutSubviews]; 
    
        // Find a reference point to calculate the offset: 
        CGRect bounds = self.bounds; 
        CGFloat pageGap = 8.f; 
        CGSize pageSize = bounds.size; 
        CGFloat pageWidth = pageSize.width; 
        CGFloat halfPageWidth = pageWidth/2.f; 
        CGFloat scale = self.zoomScale; 
        CGRect visibleRect = CGRectMake(bounds.origin.x/scale, bounds.origin.y/scale, bounds.size.width/scale, bounds.size.height/scale); 
        CGFloat totalWidth = [self contentSize].width/scale; 
        CGFloat scrollWidth = totalWidth - visibleRect.size.width; 
        CGFloat scrollX = CGRectGetMidX(visibleRect) - visibleRect.size.width/2.f; 
        CGFloat scrollPercentage = scrollX/scrollWidth; 
        CGFloat referencePoint = (totalWidth - pageWidth) * scrollPercentage + halfPageWidth; 
    
        // (use your own way to get all visible pages, each page is assumed to be inside a common container) 
        NSArray * visiblePages = [self visiblePages]; 
    
        // Layout each visible page: 
        for (UIView * view in visiblePages) 
        { 
         NSInteger pageIndex = [self pageIndexForView:view]; // (use your own way to get the page index) 
    
         // make a gap between pages 
         CGFloat actualPageCenter = pageWidth * pageIndex + halfPageWidth; 
         CGFloat distanceFromRefPoint = actualPageCenter - referencePoint; 
         CGFloat numOfPageFromRefPoint = distanceFromRefPoint/pageWidth; 
         CGFloat offset = numOfPageFromRefPoint * pageGap; 
         CGFloat pageLeft = actualPageCenter - halfPageWidth + offset; 
    
         view.frame = CGRectMake(pageLeft, 0.f, pageSize.width, pageSize.height); 
        } 
    } 
    
  • 関連する問題