iCarousel custom view xib автоматически изменяет ширину подвида

#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
}