-[NSString sizeWithFont:] возвращает разные результаты в сборках выпуска и отладки

Я использовал этот код для изменения размера UILabelвысота фрейма для успешного размещения динамического текста несколько раз:

(...)
CGSize labelSize = [thelabel.text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

Все было хорошо, пока я не начал создавать свои приложения, используя iOS5 SDK.

Для устройств armv6 (iPhone3G/-) при сборке для отладки размер метки нормален, но при сборке для выпуска полученное значение высоты совпадает с шириной. Я использую обе эти сборки на реальном устройстве.

Пример со следующей строкой журнала:

NSLog(@"labelSize: %f %f", labelSize.width, labelSize.height);

вывод: iphone3G - отладка>

Чт 3 ноября 18:22:50 неизвестное имя приложения [1071]: labelSize: 115.000000 19.000000

iphone3G - релиз>

Чт 3 ноября 18:22:50 неизвестное имя приложения [1071]: labelSize: 115.000000 115.000000

Может кто-нибудь помочь или предоставить мне другое решение для настройки UILabelвысота в зависимости от длины текста?

Я знаю, что есть некоторые похожие вопросы об этом методе, но они не решают эту конкретную проблему.

4 ответа

Решение

Ну, кажется, все сводится к ошибке в инструменте оптимизации кода в Xcode для устройств armv6. Создание ошибок в нескольких функциях и странное поведение повсюду.

После попытки решения в следующем посте все стало нормально: код App Store работает не так, как код Xcode/Device на iPhone 3G

Благодарю.

Была такая же проблема.

Если вы перейдете по ссылке, предоставленной vfonseca, вы получите: Есть ли способ компилировать для ARM, а не Thumb в Xcode 4?

И выбранный ответ говорит вам, как добавить правильные флаги компилятора, чтобы предотвратить это. Или обновите до Xcode 4.3, который исправил эту ошибку.

Я обнаружил разницу в том, что sizeWithFont:constrainedToSize:lineBreakMode: будет возвращаться в зависимости от архитектуры, на которой работает ваш код. Я использовал функцию для вычисления высоты строк, которые я хочу отобразить в UILabels в UITableViewCells, чтобы я мог рассчитать окончательную высоту ячейки. Я получил один размер на своем iPhone 4, а тестер получал большие большие ячейки на их iPod (старое устройство armv6).

Решение было размещено здесь: есть ли способ компилировать для ARM, а не Thumb в Xcode 4?

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

Мне все еще не удалось понять проблему.

Хотя, заменил метод изменения размера UILabel альтернативным способом:

//init and store initial rect
CGRect initialLabelRect = CGRectMake(2*kMargin, auxHeight , 200, 0 /*will be overriden*/);
UILabel *dataLabel = [[UILabel alloc] initWithFrame:initialLabelRect];
dataLabel.text = @"long text here";
[dataLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:15]];          
//fit size will adjust both width and height, but i'll be discarding the width
[dataLabel sizeToFit];
//set the new frame (initial, but with the computed height)
dataLabel.frame = CGRectMake(initialLabelRect.origin.x, initialLabelRect.origin.y, initialLabelRect.size.width, dataLabel.frame.size.height);

//add and release 
[superview addSubview:dataLabel];
[dataLabel release];

Итак, проблема сохраняется, но пока... Я заменяю вхождения кода для этого подхода.

Если кто-то придумает подсказку о том, что произошло, пожалуйста, дайте мне знать. Я предполагаю, что это + ошибка в методе sizeWithFont... но всегда проще обвинить SDK, когда мы не можем понять...:)

Спасибо вам всем. Приветствия.

Другие вопросы по тегам