2013-05-15 88 views
3

在我的應用程序中,我有一個場景內的UITableView動態更改寬度。當寬度改變時,我爲場景的擴展添加動畫 - 包括UITableView動畫UITableView部分標題的自定義視圖

UITableView包含具有自定義視圖的部分標題,其中包含錨定在視圖右側的UILabel

當我的場景變化的寬度,我動畫的表像這樣調整大小:

[UIView animateWithDuration:0.22 
         delay:0.02 
        options:UIViewAnimationOptionCurveLinear 
       animations:^ 
{ 
    //Change width to 320 from 220 
    [menuTable setFrame:CGRectMake(menuTable.frame.origin.x, menuTable.frame.origin.y, 320, menuTable.frame.size.height)]; 
} 
       completion:^(BOOL finished) 
{ 

}]; 

這順暢動畫表的大小調整,但節頭內側的標籤彈出到最終目的地 - 它不生動。

我試過撥打reloadData - 這個效果相同,沒有動畫。我嘗試撥打beginUpdatesendUpdates,但它沒有效果。

我還應該嘗試什麼?

+0

您是否使用自動佈局? – rdelmar

+0

UILabel的動畫文字不會變化。如果您爲標籤設置背景顏色,則應該看到標籤框架正確動畫,文本等待後跳轉到位。您需要UILabel的一個子類來完全控制文本如何生成。 –

+0

@rdelmar - 我正在使用自動佈局。 – BreadicalMD

回答

1

在我的標籤擴展實驗中,我發現Ryan Poolos在他的評論中所說的是真實的 - 即使標籤是用動畫擴展的,文本也會跳到它的新位置(我用文本設置爲中心對齊)。

所以,我發現唯一可行的方法是使用一個定時器,像這樣:

-(IBAction)expandLabel:(id)sender { 

    [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(expand:) userInfo:nil repeats:YES]; 
} 

-(void)expand:(NSTimer *) aTimer { 
    self.widthCon.constant += 1; 
    if (self.widthCon.constant >= 200) [aTimer invalidate]; 
} 

widthCon是一個IBOutlet的寬度約束我把在標籤上。如果您使用自動佈局,您應該通過更改約束來執行任何動畫,而不是更改框架。我沒有在節標題中用標籤試過,但我認爲它會起作用,如果您使用此方法爲表的寬度設置動畫,並且標籤的約束條件設置爲遵循表的擴展。

編輯後:

更多的試驗後,它看起來像計時器的方法是,使之成爲移動標籤(而不是擴大它)工作過的唯一途徑。在這種情況下,寬度約束將是表格視圖本身。

第二個編輯後:

更多的實驗。我發現問題是調用layoutSubviews(你不應該直接調用)而不是layoutIfNeeded。所以,你可以在沒有定時器的情況下使標籤位置變成動畫。以下是我用來製作標題的代碼,並在點擊按鈕時進行擴展:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    UITableViewHeaderFooterView *view = [[UITableViewHeaderFooterView alloc] init]; 
    view.tintColor = [UIColor yellowColor]; 
    UILabel *label = [[UILabel alloc] init]; 
    [label setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    label.backgroundColor = [UIColor redColor]; 
    label.text = @"Test"; 
    [view.contentView addSubview:label]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[label]-|" options:0 metrics:nil views:@{@"label":label}]]; 
    [view addConstraint:[NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]]; 
    return view; 
} 

-(IBAction)expandTable:(id)sender { 
    self.widthCon.constant = 300; 
    [UIView animateWithDuration:1 animations:^{ 
     [self.view layoutIfNeeded]; 
    }]; 
} 
+0

我實際上並沒有改變標籤的寬度,只有它的位置。所以也許Ryan Poolos所說的寬度變化是正確的,但對於位置變化,至少在這種情況下,這不是問題。 使用計時器手動移動標籤的框架可能會奏效,但這很麻煩。我希望這是最後的手段 - 在我看來,應該有一種方法來向Section Header View表明它應該有動畫? – BreadicalMD

+0

@BreadicalMD,好的,對不起,我誤解了你的問題。但是我的建議是用約束進行動畫處理仍然存在 - 如果使用約束對錶的寬度變化進行動畫處理,則標籤位置應該正確地跟隨。我會更新我的答案以反映這一點。 – rdelmar

+0

這也行不通:不幸的是,試圖阻止表本身從動畫 - 它的寬度現在改變而不是動畫。 'self.tableWidth.constant = 320; [UIView animateWithDuration:0.22 delay: 0.02 選項:UIViewAnimationOptionCurveLinear 動畫:^ { [menuTable layoutSubviews]; [self.view layoutSubviews]; } 完成:^(BOOL完成) { }];' – BreadicalMD

相關問題