UICollectionViewCell間隔設(shè)置為0時(shí)仍有空隙的問題

解決UICollectionView間隔設(shè)置為0時(shí)仍有空隙的問題

明明把間距設(shè)置為0了為什么還有空隙呢 ?接著往下看有兩個解決辦法等著你欢瞪。

例子:(我的代碼)
#pragma mark - <UICollectionViewDelegateFlowLayout>
 //定義每個UICollectionView 的邊距
- ( UIEdgeInsets )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:( NSInteger )section {

        return UIEdgeInsetsMake(0, 0, 0, 0);;
}
#pragma mark - X間距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
  
    return  0;
}
#pragma mark - Y間距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
   
    return  0;
}

  • 首先應(yīng)該了解一下 [[UIScreen mainScrenn] scale]
iPhone 4 之前的設(shè)備為1.0
iPhone 4 ~ iPhone 6s (除plus外) 的為2.0
iPhone 6 plus 和 iPhone 6s plus 的為3.0
對于iPhone 6 Plus之前的手機(jī)挂捻,pt和px的比例是1:2碉纺,而iPhone 6 Plus出來之后,這一比例達(dá)到了1:3,

還是不太明白的話可以谷歌一下,這里有篇擴(kuò)展閱讀: 「像素」「渲染像素」以及「物理像素」是什么東西骨田?它們有什么聯(lián)系耿导?

造成縫隙的原因

iPhone6的屏幕像素(point,也叫邏輯像素)是375*667,物理像素為750*1334,等分4份的話每一個item的寬度是375/4=93.75,這里是沒有問題的,問題是屏幕能分的最小物理像素是1,而iPhone6的[[UIScreen mainScrenn] scale]是2.0,也就是說1個屏幕像素(邏輯像素)對應(yīng)有2個物理像素,即0.5個屏幕像素對應(yīng)1個物理像素,而iPhone6四等分的寬度是93.75,根據(jù)前面的分析有0.25是不可再分的,這就是造成縫隙的原因。 同理iPhone6 Plus的[[UIScreen mainScrenn] scale]是3.0,也就是說1個屏幕像素(邏輯像素)對應(yīng)有3個物理像素,即0.333333個屏幕像素對應(yīng)1個物理像素,四等分之后是414/4=103.5,有0.16是不可再分的,也會有縫隙态贤。 ###解決辦法 思路:只要itemSize的width的小數(shù)點(diǎn)后的值等于1 / [UIScreen mainScreen].scale的值即可舱呻。

  • 解決方法 一
- (CGFloat)fixSlitWith:(CGRect)rect colCount:(CGFloat)colCount space:(CGFloat)space {
    CGFloat totalSpace = (colCount - 1) * space;//總共留出的距離
    CGFloat itemWidth = (rect.size.width - totalSpace) / colCount;// 按照真實(shí)屏幕算出的cell寬度 (iPhone6 375*667)93.75
    CGFloat fixValue = 1 / [UIScreen mainScreen].scale; //(1px=0.5pt,6Plus為3px=1pt)
    CGFloat realItemWidth = floor(itemWidth) + fixValue;//取整加fixValue  floor:如果參數(shù)是小數(shù),則求最大的整數(shù)但不大于本身.
    if (realItemWidth < itemWidth) {// 有可能原cell寬度小數(shù)點(diǎn)后一位大于0.5
        realItemWidth += fixValue;
    }
    CGFloat realWidth = colCount * realItemWidth + totalSpace;//算出屏幕等分后滿足1px=([UIScreen mainScreen].scale)pt實(shí)際的寬度,可能會超出屏幕,需要調(diào)整一下frame
    CGFloat pointX = (realWidth - rect.size.width) / 2; //偏移距離
    rect.origin.x = -pointX;//向左偏移
    rect.size.width = realWidth;
    _rect = rect;
    return realItemWidth; //每個cell的真實(shí)寬度
}
  • 解決方法 二

重寫layoutAttributesForElementsInRect方法即可

//
//  GSCollectionViewFlowLayout.m
//  SuperSearch
//
//  Created by 鞏小鵬 on 2018/4/17.
//  Copyright ? 2018年 鞏小鵬. All rights reserved.
//

#import "GSCollectionViewFlowLayout.h"

@interface GSCollectionViewFlowLayout()

@end
@implementation GSCollectionViewFlowLayout

#pragma mark - 初始化layout的結(jié)構(gòu)和初始需要的參數(shù)
- (void)prepareLayout
{
    [super prepareLayout];
    

}

//#pragma mark - cell的左右間距

- (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {

    NSMutableArray * answer = [[super layoutAttributesForElementsInRect:rect] mutableCopy];

    /* 處理左右間距 */

    for(int i = 1; i < [answer count]; ++i) {
      
            UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];

            UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];

      //注意:currentLayoutAttributes.indexPath.section 這里是單獨(dú)處理某個section的空隙悠汽,如果不需要可把if判斷刪除即可
        if (currentLayoutAttributes.indexPath.section == 0) {
       
            NSInteger maximumSpacing = 0;

            NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);

            if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {

                CGRect frame = currentLayoutAttributes.frame;

                frame.origin.x = origin + maximumSpacing;

                currentLayoutAttributes.frame = frame;

            }
         }


    }

    return answer;

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箱吕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柿冲,更是在濱河造成了極大的恐慌茬高,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻采,死亡現(xiàn)場離奇詭異雅采,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慨亲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門婚瓜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刑棵,你說我怎么就攤上這事巴刻。” “怎么了蛉签?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵胡陪,是天一觀的道長。 經(jīng)常有香客問我碍舍,道長柠座,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任片橡,我火速辦了婚禮妈经,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捧书。我一直安慰自己吹泡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布经瓷。 她就那樣靜靜地躺著爆哑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舆吮。 梳的紋絲不亂的頭發(fā)上揭朝,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天队贱,我揣著相機(jī)與錄音,去河邊找鬼萝勤。 笑死露筒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敌卓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼伶氢,長吁一口氣:“原來是場噩夢啊……” “哼趟径!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起癣防,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蜗巧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蕾盯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幕屹,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年级遭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了望拖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡挫鸽,死狀恐怖说敏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丢郊,我是刑警寧澤盔沫,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站枫匾,受9級特大地震影響架诞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜干茉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一谴忧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧等脂,春花似錦俏蛮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春才睹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躺涝。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工伟骨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饮潦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓携狭,卻偏偏與公主長得像继蜡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逛腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容