У меня есть всплывающий экран, внутри которого:
- метка, которая может появляться или не появляться (название)
- панель поиска, которая может появляться или не появляться
- метка, которая может появляться или не появляться, и имеет переменную высоту (метка справки)
- вид прокрутки, которая может появляться или не появляться, и имеет переменную высоту (некоторые сведения оследующая таблица)
- представление таблицы
Чтобы представить что-то хорошее, в viewDidLoad
я перемещаю различные кадры, чтобы правильно разместить объекты и не загромождать неиспользуемые пробелымой поповерКроме того, я затем изменяю размер таблицы (чтобы занять как можно больше места) и всплывающее окно с помощью contentSizeInPopover
(чтобы избежать почти пустого огромного всплывающего окна).Кажется, что все это изменение размера работает хорошо, но у меня есть одна большая проблема: после всего этого изменения размера некоторые ячейки моего UITableView перестают отвечать на запросы.Одна или две ячейки, обычно вторая, отвечают только в том случае, если я коснусь их внешних углов, но остальная часть ячейки полностью игнорирует любые касания.
Я перепробовал все: переместил все в viewWillAppear
,позволить autoresize делать свою работу (кажется, тоже не работает), но у меня все еще есть эта проблема каждый раз.Я обнаружил, что если я прокомментирую строки, связанные с изменением frame
таблицы, или те, что в contentSizeInPopover
, проблема прекращается, но тогда мое представление испортилось, так что это не исправить.
Если бы кто-нибудь мог дать мне что-нибудь, чтобы выбраться из этого беспорядка, это было бы замечательно.
- (CGFloat)getHeightWithoutTable {
return LIST_TITLE_HEIGHT + (self.searchBar.hidden ? 0 : LIST_SEARCH_BAR_HEIGHT) + (self.helpLabel.hidden ? 0 : self.helpLabel.frame.size.height + LIST_STD_SPACE) + (self.errorScrollView.hidden ? 0 : self.errorScrollView.frame.size.height + LIST_STD_SPACE);
}
-(void)viewDidLoad {
[super viewDidLoad];
self.tableViewOutlet.backgroundView = nil;
self.originData = [NSMutableArray array];
self.searchedData = [NSMutableArray array];
if (self.helper != nil) {
CGFloat heightOffset = 0;
// Content
self.originData = [self.helper getData];
self.tableData = [NSMutableArray arrayWithArray:self.originData];
// Title
NSString *title = [self.helper getPopoverTitle];
if (title == nil) {
self.popoverTitle.hidden = YES;
heightOffset -= LIST_TITLE_HEIGHT;
} else {
self.popoverTitle.text = [self.helper getPopoverTitle];
}
// Search
if ([self.originData count] [self getStdHeight] / 3){
self.helpLabel.lineBreakMode = UILineBreakModeTailTruncation;
[self.helpLabel sizeThatFits:CGSizeMake(self.helpLabel.frame.size.width, [self getStdHeight] / 3)];
}
heightOffset += (self.helpLabel.frame.size.height - LIST_HELP_STD_HEIGHT);
}
// Errors
if ([self.helper respondsToSelector:@selector(getErrors)]) {
self.errors = [self.helper getErrors];
}
if (self.errors == nil || [self.errors count] == 0) {
self.errorScrollView.hidden = YES;
self.errorBg.hidden = YES;
heightOffset -= LIST_ERROR_STD_HEIGHT + LIST_STD_SPACE;
} else {
[self createErrorView];
heightOffset += (self.errorScrollView.frame.size.height - LIST_ERROR_STD_HEIGHT);
}
// Table
CGFloat previewHeight = LIST_CELL_HEIGHT * [self.tableData count] + LIST_STD_SPACE;
CGFloat remainingHeight = LIST_MAX_HEIGHT - [self getHeightWithoutTable] - LIST_STD_SPACE;
CGFloat tableHeight = MIN(previewHeight, remainingHeight);
CGRect tableFrame = self.tableViewOutlet.frame;
self.tableViewOutlet.frame = CGRectMake(tableFrame.origin.x, tableFrame.origin.y + heightOffset, LIST_WIDTH, tableHeight);
// Selected items
if ([helper getSelectedObject] != nil){
int index = [self.tableData indexOfObject:[helper getSelectedObject]];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
[self.tableViewOutlet scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
}
- (CGSize)contentSizeForViewInPopover {
if (self.navigationController) {
return CGSizeMake(LIST_WIDTH, LIST_MAX_HEIGHT);
} else {
CGFloat totalHeight = [self getHeightWithoutTable] + self.tableViewOutlet.frame.size.height + LIST_STD_SPACE;
return CGSizeMake(LIST_WIDTH, totalHeight);
}
}
( gist , если вам нужна некоторая окраска, чтобы помочь вам)
Изображение пера: