#ios #swift #xcode #icarousel
#iOS #swift #xcode #icarousel
Вопрос:
Я пытаюсь добавить пользовательский вид в представление iCarousel с помощью пользовательского интерфейса XIB, но при инициализации и запуске ширина подвида представления carousel изменяется автоматически.
func carousel(carousel: iCarousel!, viewForItemAtIndex index: Int, reusingView view: UIView!) -> UIView! {
var itemView: ProfileQuestionView
//create new view if no view is available for recycling
if (view == nil) {
itemView = UINib.init(nibName: "ProfileQuestionView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! ProfileQuestionView
itemView.frame = CGRect.init(x: 20, y: 10, width: self.view.frame.width-40, height: self.carouselView.frame.height-20)
itemView.layer.borderColor = UIColor.clearColor().CGColor
itemView.layer.borderWidth = 0.5
itemView.layer.cornerRadius = 5.0;
itemView.layoutIfNeeded()
} else {
//get a reference to the label in the recycled view
itemView = view as! ProfileQuestionView
itemView.layoutIfNeeded()
}
return itemView
}
Не знаю, почему возникает эта проблема.
carouselView.type = iCarouselType.Rotary
Комментарии:
1.
itemView.tag = 1
После создания из nib и вelse
блоке выборки по тегу укажите тег для вашего представления элементаitemView = (view?.viewWithTag(1))!
. Посмотрите, устраняет ли это проблему. Нет необходимости вызыватьlayoutIfNeeded
Ответ №1:
Это просто удар и попытка. Не уверен, что это сработает.
Попробуйте изменить эту строку
itemView.frame = CGRect.init(x: 20, y: 10, width: self.view.frame.width-40, height: self.carouselView.frame.height-20)
Для
itemView.frame = CGRect.init(x: 20, y: 10, width: UIScreen.mainScreen().bounds.width-40, height: self.carouselView.frame.height-20)
Как будто вы перезагружаете свою карусель, viewDidLoad
ограничения все еще не установлены.
Также попробуйте получить свой элемент по тегу.
if (view == nil) {
itemView = UINib.init(nibName: "ProfileQuestionView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! ProfileQuestionView
// give a tag
itemView.tag = 1
//Then your rest of the code
} else {
// Reusability
itemView = (view?.viewWithTag(1))!
}
Надеюсь, это устраняет проблему.
Ответ №2:
Я столкнулся с этой проблемой в Xcode 8, но мой код может хорошо работать в Xcode 7.3.1. Поместите карусель инициализации в viewDidLayoutSubviews
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//Check if carousel is initialized or not
if self.carousel.dataSource == nil {
//Init your carousel here
}
}
Ответ №3:
Инициализируйте тип карусели в viewDidLayoutSubviews()
Метод viewDidLayoutSubviews()
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// carousel type
yourCarouselName.type = .custom
}