Search code examples
iosobjective-cpaginationuicollectionview

UICollectionView with Paging, each cell covers whole screen, issue when drag but not goes to next or previous cell yet


I'm having a problem with UICollectionView with paging enabled. Each cell will cover whole screen, so only 1 cell is visible at a time In the main view I have UICollectionView, and when user swipes to other cell, the navigation title will change according to the new cell, this works perfectly when users swipe properly, meaning that when swipe, UICollectionView push whole new cell to the screen However, when users swipe just a little bit to reveal the next cell, then move back to current showing cell, the navigation title is changed, but the content is still current one Does anyone have any idea how to solve this issue? I attached image here for illustration

Here's my code:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    SingleLabViewCollectionScrollCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:collectionCellID forIndexPath:indexPath];
    if (cell == nil){
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SingleLabViewCollectionScrollCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    
    // hide
    [cell.viewMain2 setHidden:YES];
    [cell.viewMain3 setHidden:YES];
    [cell.viewBubble2 setHidden:YES];
    [cell.viewBubble3 setHidden:YES];
    
    // set text view
    [cell.lblLabText setFont:FONT_AVANT_BOOK(cell.lblLabText.font.pointSize)];
    [cell.textview setScrollEnabled:YES];
    [cell.textview setUserInteractionEnabled:YES];
    
    NSDictionary *thisDict = [dictLabContentPlist valueForKey:self.titleName];
    if(thisDict != nil){
        NSDictionary *thisDictContent = [thisDict objectForKey:@"Text"];
        NSString *content = [thisDictContent valueForKey:@"Content"];
        NSAttributedString *ctAttri = [self attributedMessageFromMessage:content];
        UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(messageTapped:)];
        [cell.textview addGestureRecognizer:gesture];
        cell.textview.attributedText = ctAttri;
        cell.lblLabText.text = [thisDictContent valueForKey:@"Title"];
    }
    
    // expand textview according to text
    [cell.textview sizeToFit];
    [cell.textview layoutIfNeeded];
    cell.textview.backgroundColor = [UIColor clearColor];
    
    CGRect rect = cell.viewDescription.frame;
    rect.size.height = cell.textview.contentSize.height + 40;
    cell.viewDescription.frame = rect;
    [cell.viewMain.layer setCornerRadius:5];
    [cell.viewMain2.layer setCornerRadius:5];
    [cell.viewMain3.layer setCornerRadius:5];
    [cell.viewDescription.layer setCornerRadius:5];
    
    // set scrollview contentsize
    rect.size.height += 400;
    cell.cellScrollView.contentSize = rect.size;
    [cell.cellScrollView setScrollEnabled:YES];
    [cell.cellScrollView scrollsToTop];
    
    // set bubble view
    [cell.btnSeeMore addTarget:self action:@selector(expand:) forControlEvents:UIControlEventTouchUpInside];
    
    // get data for this testID
    for(int i = 0; i < self.arrayTestIDs.count; i++){
        if([self.arrayTestIDs[i] isEqualToString:currentID]){
            currentIndex = i;
            break;
        }
    }
    
    // load 1st time
    if(firstTimeOpenThisView){
        cell.lblTestName.text = self.arrayTestNames[currentIndex];
        self.titleName = self.arrayTestNames[currentIndex];
        currentID = self.arrayTestIDs[currentIndex];
    }else{
        currentIndex ++;
        // set title name
        cell.lblTestName.text = self.arrayTestNames[indexPath.row];
        self.titleName = self.arrayTestNames[indexPath.row];
        currentID = self.arrayTestIDs[indexPath.row];
    }
    
   
    
    NSMutableDictionary *postData = [[NSMutableDictionary alloc] init];
    [postData setValue:singleton.ACCESS_TOKEN forKey:@"token"];
    [postData setValue:currentID forKey:@"testId"];
    
    // this is new block that check db when click next
    NSArray *fetchObjects = [singleton loadDataFromTable:@"TestData"];
    // first load data from DB
    isDataExist = false;
    for(NSManagedObject *item in fetchObjects){
        if ([[item valueForKey:@"testID"] isEqualToString:[NSString stringWithFormat:@"%@",currentID]]) {
            
            dataResponseDict = [item valueForKey:@"data"];
            NSDictionary *commonDict = [dataResponseDict objectForKey:@"Common"];
            cell.lblLeftValue.text = [commonDict valueForKey:@"min"];
            cell.lblLeftLevel.text = [commonDict valueForKey:@"statusBegin"];
            cell.lblUnit.text = [commonDict valueForKey:@"avg"];
            cell.lblRightLevel.text = [commonDict valueForKey:@"statusEnd"];
            cell.lblRightValue.text = [commonDict valueForKey:@"max"];
            
            dataResponseArray = [dataResponseDict objectForKey:@"LabReport"];
            
            //kenvu
            NSDictionary *testDict = [dataResponseArray[0] objectForKey:@"Test"];
            NSString *resultStr = [testDict valueForKey:@"result"];
            if([resultStr isKindOfClass:[NSNull class]])
                numberOfRows = 1;
            else
                numberOfRows = 2;
            
            [self loadDataIntoCell:cell indexPath:indexPath];
            isDataExist=true;
            
        }
    }
    
    if(!isDataExist){ // even data exist, still needs to download from server for latest labs data
        clvMain.hidden = YES;
        [self showHud];
        [ws downloadDataWithMethod:@"viewlab" requestMethod:@"POST" data:postData completionBlock:^(NSDictionary *resultDict){
            
            NSDictionary *tmpDict = [resultDict valueForKey:WS_RESULT_DATA];
            dataResponseDict = [resultDict valueForKey:WS_RESULT_DATA];
            if(dataResponseDict != NULL && ![dataResponseDict isKindOfClass:[NSNull class]] && dataResponseDict.count > 0){
                // remove existing data for this category id
                for(NSManagedObject *item in fetchObjects){
                    if ([[item valueForKey:@"testID"] isEqualToString:[NSString stringWithFormat:@"%@",currentID]]) {
                        [singleton deleteObjectFromDB:item];
                    }
                }
                // save data to db
                NSMutableDictionary *dataToSave = [[NSMutableDictionary alloc]init];
                [dataToSave setObject:[NSString stringWithFormat:@"%@",currentID] forKey:@"testID"];
                [dataToSave setObject:tmpDict forKey:@"data"];
                [singleton saveNewData:dataToSave forTable:@"TestData"];
                
                // only reload data if no data in DB
                if(!isDataExist){
                    NSDictionary *commonDict = [dataResponseDict objectForKey:@"Common"];
                    cell.lblLeftValue.text = [commonDict valueForKey:@"min"];
                    cell.lblLeftLevel.text = [commonDict valueForKey:@"statusBegin"];
                    cell.lblUnit.text = [commonDict valueForKey:@"avg"];
                    cell.lblRightLevel.text = [commonDict valueForKey:@"statusEnd"];
                    cell.lblRightValue.text = [commonDict valueForKey:@"max"];
                    
                    dataResponseArray = [dataResponseDict objectForKey:@"LabReport"];
                    //kenvu
                    NSDictionary *testDict = [dataResponseArray[0] objectForKey:@"Test"];
                    NSString *resultStr = [testDict valueForKey:@"result"];
                    if([resultStr isKindOfClass:[NSNull class]])
                        numberOfRows = 1;
                    else
                        numberOfRows = 2;
                    
                    [self loadDataIntoCell:cell indexPath:indexPath];
                }
                
            }else{ // if data == nil, still show static info
                numberOfRows = 1;
                cell.lblLeftValue.text = cell.lblLeftLevel.text = cell.lblUnit.text = cell.lblRightLevel.text = cell.lblRightValue.text = @"";
                [self loadDataIntoCell:cell indexPath:indexPath];
            }
            [self hideHud];
            clvMain.hidden = NO;
        }];
    }
    
    
    firstTimeOpenThisView = false;
    return cell;
}

-(void)loadDataIntoCell:(SingleLabViewCollectionScrollCell *)cell indexPath:(NSIndexPath*)indexPath{
    if(indexPath.row == self.arrayTestIDs.count - 1){
        btnNext.hidden = YES;
    }else{
        btnNext.hidden = NO;
    }
    if(indexPath.row == 0){
        btnPrevious.hidden = YES;
    }else{
        btnPrevious.hidden = NO;
    }
    
    // set navigation title
    titleView.lblTestName.text = self.titleName;
    [titleView.lblTestName setFont:FONT_AVANT_BOOK(cell.lblTestName.font.pointSize)];

    .....
}

enter image description here


Solution

  • I found the solution for this. By using scrollViewDidEndDecelerating, I just add a delay of 0.1 second before getting visibleCells of UICollectionView, and it always return correct visible cell