- [NSString sizeWithFont:] возвращает разные результаты в сборках выпуска и отладки - PullRequest
3 голосов
/ 03 ноября 2011

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

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

Все было хорошо, пока я не начал создавать свои приложения с помощью iOS5SDK.

Для устройств 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 ]

3 голосов
/ 04 ноября 2011

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

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

Спасибо.

1 голос
/ 05 апреля 2012

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

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

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

0 голосов
/ 13 июля 2012

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

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

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

0 голосов
/ 04 ноября 2011

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

Хотя, заменил метод изменения размера 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, когда мы не можем понять ... :)

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

...