The reason why the collectionView spacing does not match the setting
![](https://upload.jianshu.io/users/upload_avatars/2015167/4c88a337-f1d5-41ff-a6d1-67259d26ddbe.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/96/h/96/format/webp)
Bear, bear, bear
follow
0.223
Word count 130 Reading 505
When I was working on the project today, I used the collectionview to set the spacing for that label. I found that the spacing was not equal. I immediately thought that it might be the problem of setting sectionInset or itemsize, but I went to modify how to set it and it didn't work.
like this:
![](http://upload-images.jianshu.io/upload_images/2015167-6bb359b575e5fde0.png?imageMogr2/auto-orient/strip|imageView2/2/w/812/format/webp)
Snip20161223_2.png
![](http://upload-images.jianshu.io/upload_images/2015167-8fb5f43df2f18882.png?imageMogr2/auto-orient/strip|imageView2/2/w/744/format/webp)
Snip20161223_3.png
The gap between the items is not equal, I was a little puzzled at the time, I don’t know why
Later I saw this article http://blog.csdn.net/u013604612/article/details/41450167 resolved
Solution:
Write a class that inherits UICollectionViewFlowLayout and rewrite it in the rewritten class
-(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>
}