Текст в ячейках усекается при повороте! (редактировать: также ячейки закручиваются при прокрутке) - PullRequest
1 голос
/ 23 июня 2011

Проблема:

У меня есть UITableViewCell, слово которого переносит текст при его первом появлении, но если вы повернетесь в альбомную ориентацию и снова вернетесь к портретной ориентации, текст будет обрезан!Почему это или как я могу это исправить?

Дополнительная информация:

Моя ячейка имеет стиль UITableViewCellStyleSubtitle.Чтобы обернуть текст в текст (textLabel UITableViewCellStyleSubtitle, а не detailTextLabel), я вычисляю, сколько строк в тексте, и устанавливаю это с помощью

 cell.textLabel.numberOfLines

. Я не могу просто установить numberOfLines на 0, потому что когдакнопка удаления скользит, это выглядит некрасиво.Это объясняется в моем предыдущем вопросе: Текст растягивается за границы ячейки при удалении слайда

Я установил высоту надписи с помощью heightForRowAtIndexPath, но, вероятно, это не проблема, потому что еслиЯ жестко закодировал это до огромной высоты, текст все еще будет обрезаться после поворота ориентации.

Редактировать:

С момента написания этого я заметил, что моя строка reuseIdentifier былане то же самое, когда я пытался повторно использовать камеру.Исправление это улучшило ситуацию, и иногда теперь клетки в порядке.Однако иногда они все еще усекаются при вращении, а также, если я прокручиваю вниз и снова (таким образом, ячейки перезагружаются), они могут обрезать или изменять там высоту!

Код:

//This is a call back invoked by the interface when drawing the table view. This method will create a cell for each
//row and add text to each cell depending on the string retrieved from the datasource.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCell"];
CGFloat textLabelFontSize = 19;

if (cell==nil){
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellType"] autorelease];
    // set the labels to the appropriate text for this row
    cell.textLabel.text = [(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]groupName];
    cell.textLabel.font = [UIFont systemFontOfSize:textLabelFontSize];

    if ([(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]isDynamic]){
         cell.detailTextLabel.text = NSLocalizedString(@"dynamic", @"dynamic");
    }
    else {
        //get and set the group size
        int groupSize = [(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]groupSize];

        if (groupSize == 1)
            cell.detailTextLabel.text = NSLocalizedString(@"1Contact", @"1 contact");
        else
            cell.detailTextLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%dContacts", @"%d contacts"), groupSize];
    }
}

//Calculate height (so we can hard code the number of lines, which is neccesary to avoid ugly stretching when the delete button slides in)
CGFloat width = [[self table] frame].size.width-cell.indentationWidth-50;


int section = indexPath.section;

NSString *title_string = cell.textLabel.text;
NSString *detail_string = cell.detailTextLabel.text;

CGSize title_size = {0, 0};
CGSize detail_size = {0, 0};

if (title_string && [title_string isEqualToString:@""] == NO ) {
    title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:textLabelFontSize]
                          constrainedToSize:CGSizeMake(width, 4000)
                              lineBreakMode:cell.textLabel.lineBreakMode];
}

if (detail_string && [title_string isEqualToString:@""] == NO ) {
    detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0]
                            constrainedToSize:CGSizeMake(width, 4000)
                                lineBreakMode:cell.detailTextLabel.lineBreakMode];
}

CGFloat title_height = title_size.height;
CGFloat detail_height = detail_size.height;

CGFloat content_size = title_height + detail_height;

CGFloat height;

switch ( section ) {

    case 0:
        height = content_size;
        break;

        //Just in case  
    default:
        height = 44.0;
        break;

}

//hard code numberOfLines, to avoid ugly stretching when delete slides in
cell.textLabel.numberOfLines = title_height/[UIFont systemFontOfSize:textLabelFontSize].lineHeight;
//set height for retrieval later if neccesary
cell.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, height);

return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = (UITableViewCell *)[self tableView: tableView cellForRowAtIndexPath: indexPath];
return cell.frame.size.height;
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2011

В данный момент следующий код работает на моем устройстве, но не на симуляторе.Хотя большинство тестирований нужно делать.Ключевым исправлением является повторное использование ячейки и, вероятно, [таблица reloadData]

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[table reloadData];
return [super shouldAutorotateToInterfaceOrientation:YES];
}

- (void)viewDidAppear:(BOOL)animated{
[table reloadData];
[super viewDidAppear:animated];
}

//This is a call back invoked by the interface when drawing the table view. This method will create a cell for each
//row and add text to each cell depending on the string retrieved from the datasource.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

NSString * identifier = [NSString stringWithFormat:@"SwitchCell %d", indexPath.row]; // The cell row

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
CGFloat textLabelFontSize = 19;

if (cell==nil){
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier] autorelease];
    // set the labels to the appropriate text for this row
    cell.textLabel.text = [(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]groupName];
    cell.textLabel.font = [UIFont systemFontOfSize:textLabelFontSize];

    if ([(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]isDynamic]){
         cell.detailTextLabel.text = NSLocalizedString(@"dynamic", @"dynamic");
    }
    else {
        //get and set the group size
        int groupSize = [(Group*)[composeData objectInChosenGroupsListAtIndex:indexPath.row]groupSize];

        if (groupSize == 1)
            cell.detailTextLabel.text = NSLocalizedString(@"1Contact", @"1 contact");
        else
            cell.detailTextLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%dContacts", @"%d contacts"), groupSize];
    }
}


CGFloat width = [[self table] frame].size.width-cell.indentationWidth-50;

int section = indexPath.section;

NSString *title_string = cell.textLabel.text;
NSString *detail_string = cell.detailTextLabel.text;

CGSize title_size = {0, 0};
CGSize detail_size = {0, 0};

if (title_string && [title_string isEqualToString:@""] == NO ) {
    title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:textLabelFontSize]
                          constrainedToSize:CGSizeMake(width, 4000)
                              lineBreakMode:cell.textLabel.lineBreakMode];
}

if (detail_string && [title_string isEqualToString:@""] == NO ) {
    detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0]
                            constrainedToSize:CGSizeMake(width, 4000)
                                lineBreakMode:cell.detailTextLabel.lineBreakMode];
}

CGFloat title_height = title_size.height;
CGFloat detail_height = detail_size.height;

CGFloat content_size = title_height + detail_height;

CGFloat height;

switch ( section ) {

    case 0:
        height = content_size;
        break;

        //Just in case  
    default:
        height = 44.0;
        break;

}

//hard code numberOfLines, to avoid ugly stretching when delete slides in
cell.textLabel.numberOfLines = title_height/[UIFont systemFontOfSize:textLabelFontSize].lineHeight;
//set height for retrieval later if neccesary
cell.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, height);

return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = (UITableViewCell *)[self tableView: tableView cellForRowAtIndexPath: indexPath];
return cell.frame.size.height;
}
0 голосов
/ 23 июня 2011

Это будет работать:

-(void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

}

-(void)viewWillDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
}  

Теперь реализуйте следующий метод:

-(void)checkOrientation
{
UIInterfaceOrientation orientation = self.interfaceOrientation;
if (orientation == UIDeviceOrientationLandscapeLeft||orientation==UIDeviceOrientationLandscapeRight)
{
    [tblView reloadData];  
    // Set numberOfLines = some value you think might adjust the text.
    // Set x coorinate of views if you want to change

}
else
{
    [tblView reloadData];
    // Set numberOfLines = some value you think might adjust the text.
    // Set x coordinates of views to initial x xoordinates.

}

}  

Создать recceiveRotate :

- (void)receivedRotate:(NSNotification *)notification
{    
[self checkOrientation];
}  

В viewDidLoad :

-(void)viewDidLoad
{  
[self checkOrientation];
}
...