Как установить ограничение на элемент, сфокусированный на tvOS
У меня есть UICollectionView
в моем приложении tvOS, которое имеет изображение и текст заголовка. Я установил ограничение, чтобы закрепить текст заголовка прямо под изображением.
Когда ячейка сфокусирована и изображения растут, текст не перемещается и остается над изображением. Есть ли способ установить ограничение, которое учитывает размер сфокусированного изображения?
3 ответа
Вы можете использовать UIImageView
имущество focusedFrameGuide
для этого. Возвращает UILayoutGuide
объект, который, к сожалению, не может быть использован в Интерфейсном Разработчике, но вы можете создать ограничения с ним в коде. Обратите внимание, что это ограничение имеет смысл только тогда, когда представление сфокусировано, поэтому вы должны установить его active
собственность в соответствии с self.focused
имущество.
Сначала создайте ограничение на инициализацию представления:
self.focusedSpacingConstraint = NSLayoutConstraint(item: imageView.focusedFrameGuide, attribute: .BottomMargin, relatedBy: .Equal, toItem: label, attribute: .Top, multiplier: 1, constant: 0)
//add it to the view and set active to false
Затем активируйте это ограничение или ограничение по умолчанию в зависимости от фокуса:
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
coordinator.addCoordinatedAnimations({
self.focusedSpacingConstraint.active = self.focused
self.spacingConstraint.active = !self.focused
//set label's transform and animate layout changes
}
Вы также можете использовать focusedFrameGuide
установить высоту надписи (в процентах от высоты изображения).
Преимущество этого подхода в том, что вам не нужно менять (жестко закодированный) constant
всякий раз, когда размер изображения изменяется.
Я закончил тем, что установил @IBOutlet
к моему ограничению расстояния, и я обновляю его в didUpdateFocusInContext
метод. Чтобы добавить некоторый эффект, я также трансформирую метку.
В моей коллекции ячеек:
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
coordinator.addCoordinatedAnimations({
if self.focused {
self.spacingConstraint.constant = 30
UIView.animateWithDuration(0.3) {
self.label.transform = CGAffineTransformMakeScale(1.15, 1.15)
self.layoutIfNeeded()
}
}
else {
self.spacingConstraint.constant = 0
UIView.animateWithDuration(0.3) {
self.label.transform = CGAffineTransformMakeScale(1, 1)
self.layoutIfNeeded()
}
}
}, completion: nil)
}
Используйте этот код, я надеюсь, он вам поможет. Этот код записать в пользовательский класс ячейки.
override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
if (self.focused) {
self.custom_ImageView.adjustsImageWhenAncestorFocused = true
self.custom_LabelView1.frame = CGRectMake(0, 279, 548, 29)
}
else {
self.custom_ImageView.adjustsImageWhenAncestorFocused = false
self.custom_LabelView1.frame = CGRectMake(0, 259, 548, 29)
}
}