國家代碼的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的後代使用它的基本初始化和幾個屬性。
我做我的自定義呈現這樣的:
- 在特定細胞的初始創建我的自定義字段(即的UITextField)(ESCTextFieldCell)
- prepareForReuse由框架調用細胞再利用,在那裏我刪除舊的觀察員和無效的,什麼是需要廢止
- configWithModel:(型號*)的模式,在這裏我設置單元格屬性,添加觀察者等
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都出現問題。
謝謝你的回答。它至少有助於驗證我自己的假設和發現。我沒有時間再玩一段時間,但是在完成其他工作後我肯定會回到它,我會在這個線程中發佈我的最終解決方案(如果我找到一個)。 – 2012-03-20 10:27:26