2012-02-19 50 views
0

國家代碼的UITableViewCell幀之間的變化:而呈現父視圖,模式與UIModalPresentationFormSheet

我在寫我自己的圖書館在表視圖的形式(我知道可可懂事,但願意寫我自己),我正在處理與它鬆散相關的問題。

我的表單由UITableViewController以UITableViewStyleGrouped風格保存。此表視圖控制器中的按鈕的處理程序創建與此代碼(中省略形式模型的初始化):

// prepare table view model 
_formTableViewController = [[ESCTableViewController alloc] initWithModel:model]; 
_formTableViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
                             target:self action:@selector(cancelBarButtonItemHandler:)]; 
_formTableViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit 
                              target:self action:@selector(editBarButtonItemHandler:)]; 
// prepare navigation controller containing the tableViewController 
ESCNavigationController *navigationController = [[ESCNavigationController alloc] initWithRootViewController:_formTableViewController]; 
navigationController.modalPresentationStyle = UIModalPresentationFormSheet; 

// present navigation view controller 
[self presentViewController:navigationController animated:YES completion:nil]; 

然後,我已定義UITableViewCell子類(如ESCTableViewCell)與式UITableViewCellStyleDefault和每個窗體部件​​是ESCTableViewCell的後代使用它的基本初始化和幾個屬性。

我做我的自定義呈現這樣的:

  1. 在特定細胞的初始創建我的自定義字段(即的UITextField)(ESCTextFieldCell)
  2. prepareForReuse由框架調用細胞再利用,在那裏我刪除舊的觀察員和無效的,什麼是需要廢止
  3. configWithModel:(型號*)的模式,在這裏我設置單元格屬性,添加觀察者等
  4. layoutSubviews由框架調用;這個過程中的元代碼是在這裏:

    CGFloat const ESCTextFieldWidthRatio = 0.65f; 
    CGFloat const ESCFieldHeight = 22.0f; 
    CGFloat const ESCFieldPadding = 10.0f; 
    
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    
    // call super layout subviews first 
    [super layoutSubviews]; 
    
    // count width of the text field, so it would fit with label 
    // must round() the results to avoid antialiasing on fractional values 
    CGFloat contentWidth = self.contentView.frame.size.width; 
    CGFloat contentHeight = self.contentView.frame.size.height; 
    CGFloat fieldWidth = round((contentWidth - (2 * ESCFieldPadding)) * ESCTextFieldWidthRatio); 
    CGFloat fieldOriginY = round((contentHeight/2) - (ESCFieldHeight/2)); 
    CGFloat labelWidth = contentWidth - fieldWidth - (4 * ESCFieldPadding); 
    
    // set textlabel and textfield frames 
    self.textLabel.frame = CGRectMake(ESCFieldPadding, 0.0f, labelWidth, contentHeight); 
    self.textField.frame = CGRectMake(labelWidth + (3 * ESCFieldPadding), fieldOriginY, fieldWidth, ESCFieldHeight); 
    
    [UIView commitAnimations]; 
    

問題:

我想有UI儘可能乾淨,是一個完美主義者;因此我希望在編輯模式的進入/離開時有表格視圖單元格的動畫,這在當前代碼狀態下工作得很好。

問題在於用這個窗體表格視圖來顯示模態視圖本身。 ,即呈現模式的看法時,表視圖的框架進行更新(合同)由(至少)幾個像素,這是造成兩者模式視圖轉換動畫和表格視圖單元格大小調整 - 它似乎(慢動畫通過仿真證明)動畫,這最終導致該模態視圖呈現的不那麼流暢的動畫。

我想了解的是,爲什麼表格視圖單元格在模態視圖呈現上調整大小,因爲我不喜歡在呈現模態視圖時破壞代碼以禁用動畫的想法(它可能會導致大量以後的其他問題)。

請,沒有人知道爲什麼發生這種情況,或者你有一些其他的想法如何覆蓋它的非哈克的方式?

非常感謝! PS:我正在使用ARC,但我不認爲這很重要。

PS2:iPad1和iOS模擬器iOS5都出現問題。

回答

0

我在iOS上的某些原始(讀取Apple)應用程序中看到了同樣的問題,所以我認爲它是系統的一個功能。看起來,我們能做的最好的事情就是儘可能地隱藏它。事實上,除了我之外,沒有人注意到這種行爲,所以我認爲沒有人會打擾。

不要把它的答案,但封閉。如果你對這個問題有一些真正的解決方案,請在這裏寫下來,我將其標記爲答案。

0

米羅斯拉夫,我不知道這會有所幫助,但我一直在爭取同樣的事情。我在這裏分享這個,因爲我認爲其他人可能會想知道發生了什麼。

它不只是單元格,它是整個tableview界限,直到調用ViewDidAppear時才被解決。

假設你想用UITableViewController調出一個500x500的模態,你用presentViewController啓動它,你將會進行各種調整,直到它最終在ViewDidAppear中解析。在我的例子中,我已經看到它通過調試從1024寬到320,然後最終到500.而這正是我需要確定表格視圖單元格的最終高度的寬度。

在這種情況下,這一切似乎都是黑客,我不確定是否有乾淨的解決方案,但我希望有一個。我現在正在測試它的一種方式是自定義表格視圖單元格在layoutSubviews中設置大小時會查看(如果已設置)「最終寬度」屬性。這樣,可以在tableview處於最終形式之前的任何時候計算單元格的適當高度(基於此固定寬度)。

+0

謝謝你的回答。它至少有助於驗證我自己的假設和發現。我沒有時間再玩一段時間,但是在完成其他工作後我肯定會回到它,我會在這個線程中發佈我的最終解決方案(如果我找到一個)。 – 2012-03-20 10:27:26

0

設置UITableView佈局以刪除外部自動調整大小。

enter image description here

+0

以及你在哪裏設置? – SAFAD 2014-04-10 11:53:54