collectionView 間距與設置不符合的原因
今天做項目的時候做那個標籤 用collectionview 設置了間距, 發現間距不相等 我第一時間想到可能是設置sectionInset或者itemsize的問題,但是我去修改怎麼去設置都沒效果
就像這樣:
item之間的間隙不相等, 我當時有點納悶了 不知道什麼原因
後來看見這篇文章http://blog.csdn.net/u013604612/article/details/41450167解決了
解決辦法:
寫個類繼承UICollectionViewFlowLayout,在重寫的類裏面重寫
-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
NSMutableArray<span class="token operator">*</span> attributes <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token keyword">super</span> layoutAttributesForElementsInRect<span class="token punctuation">:</span>rect<span class="token punctuation">]</span> mutableCopy<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>UICollectionViewLayoutAttributes <span class="token operator">*</span>attr <span class="token keyword">in</span> attributes<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">NSLog</span><span class="token punctuation">(</span><span class="token string">@"%@"</span><span class="token punctuation">,</span> <span class="token function">NSStringFromCGRect</span><span class="token punctuation">(</span><span class="token punctuation">[</span>attr frame<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//從第二個循環到最後一個</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token punctuation">[</span>attributes count<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//當前attributes</span> UICollectionViewLayoutAttributes <span class="token operator">*</span>currentLayoutAttributes <span class="token operator">=</span> attributes<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//上一個attributes</span> UICollectionViewLayoutAttributes <span class="token operator">*</span>prevLayoutAttributes <span class="token operator">=</span> attributes<span class="token punctuation">[</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//我們想設置的最大間距,可根據需要改</span> NSInteger maximumSpacing <span class="token operator">=</span> <span class="token number">5.0</span><span class="token punctuation">;</span> <span class="token comment">//前一個cell的最右邊</span> NSInteger origin <span class="token operator">=</span> <span class="token function">CGRectGetMaxX</span><span class="token punctuation">(</span>prevLayoutAttributes<span class="token punctuation">.</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//如果當前一個cell的最右邊加上我們想要的間距加上當前cell的寬度依然在contentSize中,我們改變當前cell的原點位置</span> <span class="token comment">//不加這個判斷的後果是,UICollectionView只顯示一行,原因是下面所有cell的x值都被加到第一行最後一個元素的後面了</span> <span class="token keyword">if</span><span class="token punctuation">(</span>origin <span class="token operator">+</span> maximumSpacing <span class="token operator">+</span> currentLayoutAttributes<span class="token punctuation">.</span>frame<span class="token punctuation">.</span>size<span class="token punctuation">.</span>width <span class="token operator"><</span> <span class="token keyword">self</span><span class="token punctuation">.</span>collectionViewContentSize<span class="token punctuation">.</span>width<span class="token punctuation">)</span> <span class="token punctuation">{</span> CGRect frame <span class="token operator">=</span> currentLayoutAttributes<span class="token punctuation">.</span>frame<span class="token punctuation">;</span> frame<span class="token punctuation">.</span>origin<span class="token punctuation">.</span>x <span class="token operator">=</span> origin <span class="token operator">+</span> maximumSpacing<span class="token punctuation">;</span> currentLayoutAttributes<span class="token punctuation">.</span>frame <span class="token operator">=</span> frame<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> attributes<span class="token punctuation">;</span>
}