2012-03-05 5 views
1

私はiOSのレイアウト問題の合理的な解決策を見つけようとしています。iOSレイアウトイメージを動的に

----------- 
| x x | 
| x x | 
| x x | 
| x x | 
| x x | 
| x x | 
----------- 

各画像は、異なる幅を有することができるが、高さは最大値を有し、各画像は、それがカラム年代にセンタリングされる。

私はこのレイアウトでビュー中、nイメージをロードする必要があります。

推奨されるアプローチは何ですか?

私は横に50%の幅を持つビューを配置してから、画像を中央に配置することを考えています。

ありがとうございます!

+0

私はダウン投票を理解していません。この質問は有効ではありませんか? –

答えて

3

これはあなたに役立つはずです。ただし、画像の比率は考慮しません。

CGRect bounds = [[UIScreen mainScreen] bounds]; 
CGFloat maxCol = [imageViewArray count] + ([imageViewArray count] % 2); 
CGFloat width = (bounds.size.width/2) - 15; 
CGFloat height = (bounds.size.height/maxCol) - 10; 

// loop through imageViews 
for(pos = 0; pos < [imageViewArray count]; pos++) 
{ 
    // calculate position within grid 
    CGFloat row = (pos/2); 
    CGFloat col = (pos%2); 


    // retrieves UIImageView and UIImage 
    imageView  = [imageViewArray objectAtIndex:pos]; 
    image   = imageView.image; 

    // calculates image size 
    CGFloat scaledWidth = (height * image.size.width)/image.size.height; 

    // adjust size of image view 
    imageView.frame = CGRectMake(0,   // temp value for x 
           0,   // temp value for y 
           height,  // width of image 
           scaledWidth); // height of image 

    // adjust position of image view 
    imageView.center = CGPointMake((bounds.size.width/3) + ((bounds.size.width/3) * col), 
            ((height+10) * row) + (height+10)/2)); 

    // add image view to super view 
    [rootView addSubView:imageView]; 
}; 

上記スケーリングは、グリッド位置の高さが常にグリッド位置の幅よりも小さくなっていることを前提としています。

+0

ありがとう、私はあなたのコードを試して、はい、それは正しい軌道にあるようです。 –

1

グリフを描画するときにテキストエンジンに同じ問題があるように見えます。あなたがしたいことは、まず何かをする前に行の幅を計算することです。これは、左から右にループすることによって行われ、エッジに到達するまでビューのサイズを追加し、追加することはできません。その行の幅と最大高さを知っていて、右側に残した余白を2で割ったものに等しいオフセットを左端に追加するだけでビューを中央に置くだけです。そして、その行の最大高さでy座標にオフセットを追加します。

すべてのビューがすべての位置になるまで、すべてのビューに対してその操作を続けます。

+0

私はあなたの提案を理解しなかったか、あなたは私の問題を理解していませんでした。私は行のビューの数を知っている(2)。したがって、各列の幅が160であるiphoneでは、問題は各列の内側にイメージを中央に配置する必要があることです。 –

2

多くの画像を読み込むと、パフォーマンス上の問題が発生します。これを行うより良い方法 - UITableViewcustom cellsを使用してください。

+0

はい、そのオプションですが、各行にバインドされたデータソースに2つのitensを持つのは奇妙ですか? –

+0

いいえ何が奇妙ですか?また、私がパフォーマンスについて話している場合、 'tableView:willDisplayCell:forRowAtIndexPath:'にファイルシステムからイメージを読み込むことができます。 –

+0

私はiOS開発者が新しく、私の理解は、uitableviewの概念はデータソースを持ち、各行に1つの項目をバインドすることでした。だからこそ、データソースから2つの要素を各行にバインドするのが変だと感じていたのです。しかし、その大丈夫なら、それは間違いなく選択肢です。ありがとう –

関連する問題