Я использую Xcode 6 Beta 3, iOS 8 SDK. Сборка целевой iOS 7.0 с использованием Swift. Пожалуйста, обратитесь к моей проблеме шаг за шагом со скриншотами ниже.
У меня есть UICollectionView в раскадровке. 1 Прототип UICollectionViewCell, который содержит 1 метку в центре (без правила автоматического изменения размера). Фиолетовый фон должен был отмечать contentView, который генерируется во время выполнения Ячейкой. Это представление будет изменено должным образом на основе моего UICollectionViewLayoutDelegate в конечном итоге, но не на iOS 7. Обратите внимание, что я использую Xcode 6, и проблема возникает только на iOS 7.
Когда я создаю приложение на iOS 8. Все в порядке.
Примечание: фиолетовый - это contentView , синий - моя UIButton с закругленным углом.
Однако в iOS 7 все дочерние элементы внутри ячейки внезапно сжимаются до кадра (0,0,50,50) и больше не соответствуют моему правилу авторазмера.
Я предполагаю, что это ошибка в iOS 8 SDK или Swift или, может быть, Xcode?
Обновление 1: эта проблема все еще существует в официальном Xcode 6.0.1! Лучший обходной путь подобен тому, что KoCMoHaBTa предложил ниже, установив кадр в cellForItem ячейки (хотя вы должны создать подкласс для своей ячейки). Оказалось, что это несовместимость между iOS 8 SDK и iOS 7 (проверьте ответ ecotax ниже, цитируемый Apple).
Обновление 2: вставьте этот код в начало вашего cellForItem, и все должно быть в порядке:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
contentView
изменения размера ячейки работает нормально, чтобы обойти проблему. Я предполагаю, что в iOS 8 Apple что-то изменила в способе обработки представлений содержимого ячейки при создании в Интерфейсном Разработчике (который в любом случае все еще является чем-то вроде черного ящика). Но тот факт, что он изменяет поведение при настройке на iOS 7, безусловно, является ошибкой.contentView
края к краям ячейки.Ответы:
contentView не работает. Это также можно исправить в awakeFromNib
ObjC:
Swift3:
источник
Я столкнулся с той же проблемой и попросил Apple DTS о помощи. Их ответ был:
Я предполагаю, что это означает, что это не ошибка в XCode 6, а несовместимость между iOS 8 SDK и iOS 7 SDK, которая поразит вас при обновлении до Xcode 6, потому что он автоматически начнет использовать iOS 8 SDK.
Как я уже говорил, обходной путь Дэниел Пламанн описал для меня работы. Те, что описывают Игорь Палагута и KoCMoHaBTa, выглядят проще, и, кажется, имеет смысл дать ответ Apple DTS, так что я попробую их позже.
источник
Я столкнулся с той же проблемой и надеюсь, что Apple исправит это в следующей версии Xcode. Тем временем я использую обходной путь. В моем
UICollectionViewCell
подклассе я просто переопределилlayoutSubviews
и изменил размер contentView вручную в случае, если размер отличается отcollectionViewCell
размера.источник
[cell layoutIfNeeded];
в cellForItem или cellForRow?Другое решение состоит в том, чтобы установить размер contentView и маски авторазмера
-collectionView:cellForItemAtIndexPath:
следующим образом:Это работает и с Auto Layout, поскольку маски автоматического изменения размера переводятся в ограничения.
источник
В Xcode 6.0.1 contentView для UICollectionViewCell не работает для устройств iOS7. Это также можно исправить, добавив надлежащие ограничения в UICollectionViewCell и его contentView в awakeFromNib или методы init.
источник
Это не будет работать правильно без каких-либо других упомянутых обходных путей из-за ошибки в Xcode 6 GM, когда Xcode компилирует файлы xib в формат nib. Хотя я не могу с уверенностью сказать, что это связано с XCode и не имеет отношения к среде выполнения, я очень уверен - вот как я могу это показать:
Я надеюсь, что каждый, кто читает этот вопрос, подаст радар в Apple. Это ОГРОМНАЯ проблема, и ее необходимо устранить до окончательного выпуска XCode.
Изменить: В свете поста ecotax , я просто хотел обновить это, чтобы сказать, что теперь подтверждены различия в поведении между сборкой в iOS 8 против iOS 7, но не ошибка. Мой хак исправил проблему, потому что сборка на iOS 7 добавила маску автоматического изменения размера к представлению контента, необходимому для этой работы, который Apple больше не добавляет.
источник
Ответы в этом посте работают, но я так и не понял, почему это работает.
Во-первых, есть два «правила»:
[UIView new]
), свойствоtranslatesAutoresizingMaskIntoConstraints
имеет значениеYES
translatesAutoresizingMaskIntoConstraints
набора вNO
Второе правило, похоже, не применяется к представлениям верхнего уровня, для которых вы не определяете ограничения. (Напр. Просмотр содержимого)
Глядя на ячейку раскадровки, обратите внимание, что ячейка не имеет ее
contentView
открытой. Мы не контролируемcontentView
Apple.Окунитесь в исходный код раскадровки и посмотрите, как
contentView
определяется ячейка:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Теперь подпредставления клетки (обратите внимание
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
У
contentView
него нетtranslatesAutoresizingMaskIntoConstraints
установленногоNO
. Кроме того, в нем отсутствует определение макета, возможно, из-за того, что сказал @ecotax .Если мы посмотрим на
contentView
, у него есть маска авторазмера, но нет определения для нее:<autoresizingMask key="autoresizingMask"/>
Итак, есть два вывода:
contentView
translatesAutoresizingMaskIntoConstraints
установлен вYES
.contentView
не хватает определения макета.Это приводит нас к двум решениям, о которых говорилось.
Вы можете установить маски авторазмера вручную
awakeFromNib
:Или вы можете установить ,
contentView
translatesAutoresizingMaskIntoConstraints
чтобыNO
вawakeFromNib
и определение ограничений в- (void)updateConstraints
.источник
Это Swift-версия ответа @ Igor, которая принята, и спасибо за приятный ответ.
Сначала перейдите к вашему
UICollectionViewCell
подклассу и вставьте следующий код в класс.Кстати, я использую Xcode 7.3.1 и Swift 2.3. Решение протестировано на iOS 9.3, которая работает без нареканий.
Спасибо, надеюсь, это помогло.
источник
В swift поместите следующий код в подкласс ячейки представления коллекции:
источник
Я обнаружил, что
contentView
в iOS 8 также есть проблемы с определением размеров. Это имеет тенденцию выкладываться очень поздно в цикле, что может вызвать временные конфликты ограничений. Чтобы решить эту проблему, я добавил следующий метод в категориюUICollectionViewCell
:Этот метод следует вызывать после удаления ячейки.
источник
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Я исправил это:
см: здесь
источник
Просто убедитесь, что вы отметили флажок «Autoresize subviews» в кончике для этой ячейки представления коллекции. Он будет отлично работать как на iOS 8, так и на iOS 7.
источник