-[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, когда мы не можем понять...:)
Спасибо вам всем. Приветствия.