簡體   English   中英

集合視圖單元格之間的不規則空間

[英]Irregular space between the collectionview cells

我是iOS開發的新手,這是我一個人做的第一個項目。 我正在嘗試使用uicollectionview顯示我學院的非官方fb頁面的提要。 我一直在嘗試許多不同的事情,但似乎沒有任何效果。 UICollectionViewController.m文件

- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"DCE Speaks Up";
self.collectionView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1];
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = NO;
NSError *error= nil;

NSURL *feedURL = [NSURL URLWithString:@"https://graph.facebook.com/382057938566656/feed?fields=id,full_picture,message,story,created_time,link&access_token=1750413825187852%7CkUl9nlZFPvdGxGZX4WYabKKG2G4"];

NSData *jsonData = [NSData dataWithContentsOfURL:feedURL];

NSDictionary *dataDictionary= [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
self.feedArray = [NSMutableArray array];
NSArray *feedTempArray = [dataDictionary objectForKey:@"data"];        //feedTempArray just used for parsing

for (NSDictionary *feedDictionary in feedTempArray) {
    FacebookFeed *fbFeed =[FacebookFeed facebookFeedWithMessage:[feedDictionary objectForKey:@"message"]];
    fbFeed.story = [feedDictionary objectForKey:@"story"];
    fbFeed.imageURL = [NSURL URLWithString:[feedDictionary objectForKey:@"full_picture"]];
    fbFeed.date = [feedDictionary objectForKey:@"created_time"];
    fbFeed.sharedLink = [NSURL URLWithString:[feedDictionary objectForKey:@"link"]];
    [self.feedArray addObject:fbFeed];
}


// Register cell classes
[self.collectionView registerClass:[FacebookCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

// Do any additional setup after loading the view.
}

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
FacebookCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
cell.feed = self.feedArray[indexPath.row];
cell.sizeDictionary = [self sizeForLabelAtIndexPath:indexPath.row collectionView:collectionView];
// Configure the cell
for (UIView *view in cell.contentView.subviews) {
    if ([view isKindOfClass:[UILabel class]]) {
        [view removeFromSuperview];
    }else if ([view isKindOfClass:[UIImageView class]]){
        [view removeFromSuperview];
    }
}
    cell.layer.shouldRasterize = YES;          
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
return cell;
}
#pragma mark <UICollectionViewDelegateFlowLayout>
-(CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    NSDictionary *sizeDictionary = [[NSDictionary alloc] init];
    sizeDictionary = [self sizeForLabelAtIndexPath:indexPath.row collectionView:collectionView];
        return CGSizeMake(self.view.frame.size.width - 20, [sizeDictionary[@"imageHeight"] floatValue] + [sizeDictionary[@"messageHeight"] floatValue] + [sizeDictionary[@"nameHeight"] floatValue]);
}
#pragma mark <UICollectionViewDelegate>
- (NSDictionary *) sizeForLabelAtIndexPath:(NSUInteger)indexPath collectionView:(UICollectionView *)collectionView{
FacebookFeed *feed = self.feedArray[indexPath];
CGSize nameSize = CGSizeFromString(@"DCE Speaks Up");
CGSize imageSize = CGSizeMake(0, 0);
if (feed.imageURL) {
    imageSize = CGSizeMake(470, 394);
}
float height = 80;
NSString *string = @"";
if (feed.message) {
    string = [feed.message stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}else if (feed.story){
    string = [feed.story stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
if (string) {
    NSDictionary *attributes = @{
                                 NSFontAttributeName : [UIFont preferredFontForTextStyle:UIFontTextStyleBody]
                                 };
    CGRect bodyFrame =
    [string boundingRectWithSize:CGSizeMake(CGRectGetWidth(collectionView.bounds),
                                            CGFLOAT_MAX)
                         options:(NSStringDrawingUsesLineFragmentOrigin)
                      attributes:attributes
                         context:nil];

    height += ceilf(CGRectGetHeight(bodyFrame));
}
return @{ @"imageHeight" : @(imageSize.height) , @"messageHeight" : @(height) , @"nameHeight" : @(nameSize.height)};
}

自定義單元文件

@implementation FacebookCollectionViewCell

- (instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self)
{
    self.contentView.backgroundColor = [UIColor whiteColor];
    // change to our custom selected background view
    self.imageView = [[UIImageView alloc] init];
    self.messageLabel = [[UILabel alloc] init];
    self.nameLabel = [[UILabel alloc] init];
}
return self;
}

-(void) setFeed:(FacebookFeed *)feed{
_feed = feed;
self.messageLabel.numberOfLines = 0;
self.messageLabel.lineBreakMode = 0;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSData *data= [NSData dataWithContentsOfURL:feed.imageURL];
    UIImage *theImage=[UIImage imageWithData:data];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image= theImage ;
    });
});
if (feed.message) {
    self.messageLabel.text =  [[NSString alloc] initWithString:[feed.message stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}else{
    self.messageLabel.text = [[NSString alloc] initWithString:[feed.story stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}
self.messageLabel.font = [UIFont fontWithName:@"ArialMT" size:11];
[self.messageLabel sizeToFit];
self.nameLabel.text = @"DCE Speaks Up";
[self.nameLabel setFont:[UIFont fontWithName:@"ArialMT" size:12]];
[self.nameLabel sizeToFit];
}
-(void) layoutSubviews{
NSLog(@"%@",self.feed);
self.nameLabel.frame = CGRectMake(10, 10, self.contentView.bounds.size.width, [self.sizeDictionary[@"nameHeight"] floatValue]);
float height = 200;
if (self.contentView.bounds.size.height - [self.sizeDictionary[@"messageHeight"] floatValue] -[self.sizeDictionary[@"nameHeight"] floatValue] >100) {
    height = self.contentView.bounds.size.height - [self.sizeDictionary[@"messageHeight"] floatValue] -[self.sizeDictionary[@"nameHeight"] floatValue];
}
if (self.feed.imageURL) {
    self.imageView.frame = CGRectMake(10, [self.sizeDictionary[@"messageHeight"] floatValue] +[self.sizeDictionary[@"nameHeight"] floatValue], self.contentView.bounds.size.width - 20,height);
    self.messageLabel.frame = CGRectMake(10, [self.sizeDictionary[@"nameHeight"] floatValue] +10, self.contentView.bounds.size.width - 10, [self.sizeDictionary[@"messageHeight"] floatValue]);

    [self.contentView addSubview:self.messageLabel];
    [self.contentView addSubview:self.imageView];

}else{
    self.messageLabel.frame = CGRectMake(10, [self.sizeDictionary[@"nameHeight"] floatValue], self.contentView.bounds.size.width - 10, [self.sizeDictionary[@"messageHeight"] floatValue]);
    [self.contentView addSubview:self.messageLabel];
}
[self.contentView addSubview:self.nameLabel];

} 
@end

在此處輸入圖片說明 在此處輸入圖片說明

使用NSLayoutConstraint ,這是標准和最佳實踐。 另外,您不應該在layoutSubviews()添加子視圖,因為此方法可能會被調用多次。 我還建議將像元大小計算代碼移到UICollectionViewCell子類中。

您的代碼中發生了很多奇怪的事情,因此很難說出是什么導致了您的問題。 它可能是所有子視圖添加/刪除和手動大小計算的組合。 您還可以使用可視調試器為您提供有關可能發生的情況的一些線索: https : //www.raywenderlich.com/98356/view-debugging-in-xcode-6

我相信您的問題在這里:

-(CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    NSDictionary *sizeDictionary = [[NSDictionary alloc] init];
    sizeDictionary = [self sizeForLabelAtIndexPath:indexPath.row collectionView:collectionView];
    return CGSizeMake(self.view.frame.size.width - 20, [sizeDictionary[@"imageHeight"] floatValue] + [sizeDictionary[@"messageHeight"] floatValue] + [sizeDictionary[@"nameHeight"] floatValue]);
}

您在CGSizeMake中設置寬度:

self.view.frame.size.width - 20

和高度:

[sizeDictionary[@"imageHeight"] floatValue] + [sizeDictionary[@"messageHeight"] floatValue] + [sizeDictionary[@"nameHeight"] floatValue]

檢查一下您的身高大小是否正確。 看起來太大了。 該方法返回每個單元格的大小。 我相信您設定的身高比您想要的高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM