2

展開/折りたたみ可能な UITableViewCells を作成するさまざまな方法をインターネットで閲覧した後、今日の早い段階でアプローチを開始しました。

UITableView(COLLAPSED=0, EXPANDED=1) の各行の状態を保持する配列があります。展開ボタンがクリックされると、配列の状態を反転し、更新が必要なセクションで reloadSection を呼び出します。

デリゲート メソッドの heightForRowAtIndexPath で、セルを展開する必要があるかどうかを確認し、適切な高さを返します。私が直面している問題は、セルが実際に拡大することですが、下に隠れているコンテンツを表示する代わりに (IB でセルを短くして下に追加情報を入れてセルを大きくし、セルのオーバーラップを修正するためにクリップ サブビューを有効にしました)、表示されます私のものと同様の背景を持つ他の2つのグループ化されたUITableViewCellsは、いくつかのラベル/ボタンの配置をオフにします。

通常の様子と拡大した様子の写真を含めています。コードを確認しましたが、すべて問題ないように見えます。これを適切にレンダリングするには、設定を変更する必要があると思います。

折りたたまれた

エキスパンド

IB の崩壊セル

IB の拡張セル

ソースは次のとおりです。

#define UITABLEVIEWCELLSIZE_COLLAPSED 97
#define UITABLEVIEWCELLSIZE_EXPANDED 285
#define EXPANDED 1
#define COLLAPSED 0

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSNumber *state = [cellExpansionArray objectAtIndex:[indexPath section]];
    if ([state intValue] == COLLAPSED) {
        return UITABLEVIEWCELLSIZE_COLLAPSED;
    }else if([state intValue] == EXPANDED) {
        return UITABLEVIEWCELLSIZE_EXPANDED;
    }
    return UITABLEVIEWCELLSIZE_COLLAPSED;
}

//expandCell is called when the arrow indicator is clicked on the cell
-(IBAction)expandCell:(id)sender
{
    NSInteger cellNumber = [sender tag];
    NSNumber *state = [cellExpansionArray objectAtIndex:cellNumber];
    if (state.intValue == 0) {
        [cellExpansionArray replaceObjectAtIndex:cellNumber withObject:[NSNumber numberWithInt:EXPANDED]];
    }else if (state.intValue == 1) {
        [cellExpansionArray replaceObjectAtIndex:cellNumber withObject:[NSNumber numberWithInt:COLLAPSED]];
    }
    //[self.tableView beginUpdates];
    //[self.tableView endUpdates];
    //[self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:cellNumber] withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"PCFCustomCell";
    PCFCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //cell.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    [cell setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"1slot.png"]]];
    PCFClassModel *course = [classesOffered objectAtIndex:[indexPath section]];
    cell.courseCRN.text = [course CRN];
    cell.courseDataRange.text = [course dateRange];
    cell.courseDaysOffered.text = [course days];
    cell.courseHours.text = [course credits];
    cell.courseInstructor.text = [course instructor];
    cell.courseTime.text = [course time];
    cell.courseLocation.text = [course classLocation];
    cell.courseSection.text = [course sectionNum];
    cell.courseName.text = [course courseNumber];
    cell.courseTitle.text = [course classTitle];
    cell.courseType.text = [course scheduleType];
    //cell.professorEmail.text = [course instructorEmail];
    [cell.mailProf setTag:[indexPath section]];
    [cell.showCatalog setTag:[indexPath section]];
    [cell.followClass setTag:[indexPath section]];
    [cell.addToSchedule setTag:[indexPath section]];
    [cell.buttonDropDown setTag:[indexPath section]];
    [cell.mailProf setHidden:NO];
    [cell.mailProf setEnabled:YES];
        if (![course instructorEmail]) {
            [cell.mailProf setTitle:@"NO EMAIL PROVIDED" forState:UIControlStateNormal];
            [cell.mailProf setEnabled:NO];
        }
    [cell.followClass setBackgroundImage:[UIImage imageNamed:@"search_res_11.png"] forState:UIControlStateNormal];
    [cell.addToSchedule setBackgroundImage:[UIImage imageNamed:@"search_res_09.png"] forState:UIControlStateNormal];
    if ([savedResults count] > 0) {
        for (PCFClassModel *courseTwo in savedResults) {
            if ([[courseTwo CRN] isEqualToString:[course CRN]]) {
                [[cell followClass] setBackgroundImage:[UIImage imageNamed:@"favorite_activated.png"] forState:UIControlStateNormal];
                break;
            }
        }
    }
    //schedule
    if ([savedSchedule count] > 0) {
        for (PCFClassModel *courseTwo in savedSchedule) {
            if ([[courseTwo CRN] isEqualToString:[course CRN]]) {
                [[cell addToSchedule] setBackgroundImage:[UIImage imageNamed:@"purdue_activated.png"] forState:UIControlStateNormal];
                break;
            }
        }
    }
    [cell.mailProf addTarget:self action:@selector(mailProf:) forControlEvents:UIControlEventTouchUpInside];
    [cell.showCatalog addTarget:self action:@selector(showCatalog:) forControlEvents:UIControlEventTouchUpInside];
    [cell.followClass addTarget:self action:@selector(followClass:) forControlEvents:UIControlEventTouchUpInside];
    [cell.addToSchedule addTarget:self action:@selector(addToSchedule:) forControlEvents:UIControlEventTouchUpInside];
    [cell.buttonDropDown addTarget:self action:@selector(expandCell:) forControlEvents:UIControlEventTouchUpInside];
    //get internet data
    /*
    [[cell staticAvailable] setHidden:YES];
    [[cell available] setHidden:YES];
    [cell.available setText:@""];
    [[cell remainingActivityIndicator] startAnimating];
    dispatch_queue_t getSpots = dispatch_queue_create("GetSpots", nil);
    dispatch_async(getSpots, ^{
        NSString *webData = nil;
        while (!webData && self.view.window) webData = [PCFWebModel queryServer:[course classLink] connectionType:nil referer:@"https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_get_crse_unsec" arguements:nil];
        if (!self.view.window) return;
        NSArray *courseRecord = [PCFWebModel parseData:webData type:3];
        PCFCourseRecord *record = [courseRecord objectAtIndex:0];
        dispatch_async(dispatch_get_main_queue(), ^{
            [[cell remainingActivityIndicator] stopAnimating];
            [[cell staticAvailable] setHidden:NO];
            NSString *val = @"1";
            if ([val compare:record.enrolled] > 0) {
                //[[cell available] setTextColor:[UIColor redColor]];
            }else {
                //[[cell available] setTextColor:[UIColor colorWithRed:.0565442 green:.430819 blue:.0724145 alpha:1]];

            }
            [[cell available] setText:[NSString stringWithFormat:@"SLOTS: %@/%@", record.enrolled,record.capacity]];
            [[cell available] setHidden:NO];
            [PCFAnimationModel fadeTextIntoView:cell.available time:1];
            [PCFAnimationModel fadeTextIntoView:cell.staticAvailable time:1];
        });
    });
    */
    // Configure the cell...
    //[PCFFontFactory convertViewToFont:cell];
    [cell.courseTitle setFont:[PCFFontFactory droidSansFontWithSize:13]];
    [cell.courseName setFont:[PCFFontFactory droidSansFontWithSize:38]];
    [cell.courseDaysOffered setFont:[PCFFontFactory droidSansBoldFontWithSize:11]];
    NSNumber *state = [cellExpansionArray objectAtIndex:indexPath.section];
    if (state.intValue == COLLAPSED) {
        [cell.imageViewBackground setHidden:YES];
    }else {
        //[cell.imageViewBackground setHidden:NO];
    }
    return cell;
}
4

3 に答える 3

0

これは私には自動サイズの問題のように見えます! セルのサブビューには、柔軟なマージンと幅、高さがあります。正確な解決策ではなく、いくつかの提案をすることができます。彼らが助けてくれることを願っています..

  1. 自動サイズ変更プロパティをサブビューから削除してみてください (XIB で、[ビュー] -> [サイズ インスペクター] -> [自動サイズ変更] をクリックします) または
  2. ステートの展開時と折りたたみ時に使用する 2 つの異なるセル テンプレートを作成します。2 つの異なるセル ビューを持つ同じセル XIB。UINib を使用して xib をロードします。
  3. 画像が固定サイズの場合、パターン画像をセルの背景として使用しないでください。 stretchableImageWithLeftCapWidth:topCapHeight画像 APIを利用します。

乾杯!
アマール。

于 2013-05-03T13:09:26.033 に答える