UIActivityIndicatorView смещен

У меня есть UIActivityIndicatorView по центру по горизонтали в XIB.

XIB

В iOS 4 (Simulator) индикатор по умолчанию имеет значение Large White (свойство цвета введено в iOS 5), и это нормально. Странная часть заключается в том, что он также смещен.

iOS4

Мое первоначальное предположение заключалось в том, что что-то не так с XIB (или что-то в этом роде). Однако в iOS 5 (Симулятор, iPhone 4) работает отлично.

iOS5

Увидев, что единственное, что изменилось с iOS 4 на iOS 5 в отношении UIActivityIndicatorViews, — это добавление свойства color, я в тупике. Я знаю, что здесь, вероятно, недостаточно информации, чтобы точно определить проблему. Меня больше беспокоит, с чего начать отладку, и я приветствую любые предложения относительно того, какую дополнительную информацию я мог бы предоставить.

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

  • iPad загружает индикатор в надежном месте, меняя цвета только между iOS 4 и iOS 5.
  • У меня есть две статические исходные точки (portPoint = (x, y); landPoint = (w, z);), которые я вручную устанавливаю при вращении. Когда приложение загружается, источник индикатора (правильно) portPoint (что я проверил с помощью NSLog), несмотря на визуальное смещение. Когда я поворачиваюсь к альбомной ориентации, исходная точка правильно (визуально и с точки зрения данных) устанавливается на landPoint. Когда я поворачиваюсь назад, исходная точка правильно (визуально и с точки зрения данных) устанавливается на portPoint, что решает проблему.

person Patrick Perini    schedule 30.11.2011    source источник
comment
Сделайте чистую сборку и повторите попытку. Возможно, удалите приложение из Симулятора. Проверьте свои маски автоматического изменения размера.   -  person Ole Begemann    schedule 30.11.2011
comment
Очистить/Очистить папку сборки. Сбросить весь контент на сим. AutoresizingMask = UIViewAutoresizingNone. Все равно ничего хорошего :(   -  person Patrick Perini    schedule 30.11.2011
comment
Можете ли вы загрузить минимально жизнеспособный проект? Я вижу, у вас есть Github, на котором это можно разместить.   -  person JoePasq    schedule 10.12.2011
comment
Автоматическое изменение размераНет? Все поля должны быть гибкими!   -  person Sulthan    schedule 16.12.2011


Ответы (3)


Вы правы в том, что, не видя вашего кода, я не могу сказать, происходит ли что-то еще, но центрирование представления в суперпредставлении и поддержание этого при вращении устройства довольно просто. Попробуй это:

  1. Убедитесь, что autoResizingMask из UIActivityIndicatorView установлено на UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin

  2. Разместите индикатор активности в центре его супервизора либо в файле XIB, либо в viewDidLoad

  3. Не меняйте рамку индикатора активности при вращении, она должна оставаться в центре автоматически

Если приведенное выше не помогло, опубликуйте код вместе со значениями autoResizingMask и contentMode для соответствующих представлений.

person XJones    schedule 16.12.2011
comment
Так что это была не 100% моя проблема. Одна часть, которая отсутствовала, заключается в том, что по какой-то причине в iOS 4.3 были некоторые ошибочные повороты при запуске, которые вызывали раскол между автоматическим изменением размера и моим явным размещением ActivityIndicatorView. - person Patrick Perini; 16.12.2011
comment
Этот ответ был золотым, особенно потому, что было отмечено, что он НЕ меняет рамку UIActivityIndicator после установки autoResizingMask. Как только я закомментировал код смены рамки при смене ориентации, все заработало! Спасибо, - person Prethen; 24.09.2014

Это выглядит так, как будто устройство находится в альбомной ориентации. Убедитесь, что вы перемещаете его правильно при изменении размера или ориентации вида.

person TomSwift    schedule 09.12.2011
comment
Следите за моими обновлениями относительно ротации? Есть странное явление, которое может иметь значение. - person Patrick Perini; 10.12.2011

Идеи:

1/Ваш вид (суперпросмотр индикатора активности) больше, чем ваш дисплей (плохая маска автоматического изменения размера? Неверные значения в xib plist?) или он имеет неправильное положение внутри своего супервизора.

2/ Маски автоматического изменения размера установлены неправильно. Для индикатора активности это должно быть

(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

Чтобы отладить это, попробуйте включить ведение журнала в viewDidAppear. Получите центр (CGPoint) вашего индикатора активности и используйте методы UIView, чтобы преобразовать его в ваши координаты вида сверху (например, [UIView convertPoint:fromView:]). Это положение должно совпадать с тем, что вы видите на экране.

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

Убедитесь, что вы регистрируете информацию в нужном месте и не меняете позиции просмотра после регистрации.

person Sulthan    schedule 15.12.2011