Пользовательский UIView имеет неправильный размер (рамка, границы) - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть «основное представление», в которое я пытаюсь загрузить несколько пользовательских представлений в ...

Внутри этого «основного представления» у меня есть «представления шаблона», в которые я хочу переместить настраиваемые представления ви вне (например, один «вид шаблона» может иметь настраиваемое представление с полем поиска в нем в одной точке жизненного цикла приложений, а в другой - в представлении изображения).Я хочу сделать это, чтобы не иметь много ViewControllers и Segues в моем приложении.

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

Внутри «основного представления» ViewDidLoad () Я инициализирую свойства настраиваемого представления, вызывая функцию CustomView.init (frame :), и передаю в функцию границы «представления шаблона». Мне нужен CustomView.быть размером с.

// РЕДАКТИРОВАТЬ: Я фактически инициализирую свойства пользовательского представления из функции awakeFromNib пользовательской ячейки.Ячейка загружается в табличное представление, которое является подпредставлением основного представления.//

Кажется, это работает ... за исключением того, что ширина пользовательского представления неверна при запуске приложения.Задний конец пользовательского представления простирается за ширину представления шаблона (вплоть до самого края экрана), но представление шаблона правильно завершает 10 точек перед задним краем экрана.

Внутри файла класса CustomView функция init выглядит следующим образом:



class CustomView: UIView {

     var firstViewInHierarchy: UIView

     var possibleFrame: CGRect? = nil

     override init(frame: CGRect) {
          super.init(frame: frame)
          self.possibleFrame = frame
          commonInit()
     }

     required init?(coder: NSCoder) {
          super.init(coder: coder)
          commonInit()
     }

     private func commonInit() {
          Bundle.main.loadNibNamed("MainProfileView", owner: self, options: nil)

          if let theFrame = self.possibleFrame {
               self.firstViewInHierarchy.frame = theFrame
               self.firstViewInHierarchy.bounds = theFrame
               self.frame = theFrame
               self.bounds = theFrame
          }

          filmView1.layer.cornerRadius = 10
          filmView1.clipsToBounds = true

          imageContainer.layer.cornerRadius = 10
          imageContainer.clipsToBounds = true

          imageView.layer.cornerRadius = 5
          imageView.clipsToBounds = true

          self.addSubview(firstView)
     }

Я устанавливаю рамку и границы свойства CustomView.frame и свойства CustomView.firstViewInHierarchy для CGRectопределяется возможной рамкой, потому что я подумал, что если одна из них не установлена ​​в возможную рамку, это приведет к неправильному размеру собственного представления после инициализации через вызов init (frame :) ... который я вызываю в «главном представлении»Настраиваемый класс ячеек таблицы с функцией awakeFromNib ... здесь:

class CustomCellThatGoesIntoMainView: UITableViewCell {

     @IBOutlet weak var templateViewOne: UIView!

     @IBOutlet weak var templateViewTwo: UIView!

     var customView1: CustomViewTypeOne?

     var customView2: CustomViewTypeTwo?

    // the template views are actually inside a table view cell inside a tableview which is 
    // inside the main view

     override func awakeFromNib() {
          super.awakeFromNib()

          self.customView1 = CustomViewType1(frame: templateViewOne.bounds)
          self.templateViewOne.addSubview(profileView!)

          self.customView2 = CustomViewType2(frame: templateViewTwo.bounds)
          self.templateViewOne.addSubview(profileView!)


     }
}


I resized one of the template views to have a much greater Height and the Custom View did size itself appropriately height-wise. However, it still extends to the very edge of the screen. 

???

1 Ответ

0 голосов
/ 21 сентября 2019

Оказывается, что когда я печатал рамку и границы всех задействованных объектов:

  • UIScreen.main.bounds.width был равен 375
  • TemplateView.bounds.width был равен 394
  • CustomView.width после инициализации был равен 394

  • CGRect кадра TemplateView было [10, 120,394, 155], что, кроме ширины, было правильным.Я установил высоту 155 в раскадровке.

Однако ... казалось, что в файле XIB, который обрабатывал CustomView, были проблемы.Я уже перешел эту проблему, но я думаю, что иерархия CustomView была что-то вроде:

  • FirstViewInHierarchy | --- FirstSubview | --- ImageContainer ... и т. Д.

Я полагаю, что FirstViewInHierarchy не имел ограничений, поскольку он был установлен в произвольной форме.

FirstSubview имел ограничения, которые, по моему мнению, установили равными FirstViewInHierarchy, но я думаю, что они были сложными ...ограничения ImageContainer.Я действительно пролетел мимо этого, поэтому я прошу прощения за то, что не знал точно.

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

На этот раз в файле XIB я просто избавился от FirstSubview и установил ImageView равным FirstViewInTheHierarchy.

Затем в Интерфейсном Разработчике вместо установки конечных и ведущих ограничений TemplateViews, равных конечным и передним краям экрана +/- десять точек, я дал представлению шаблона 4 ограничения:

  1. Ведущее ограничение = 10 баллов
  2. Верхнее ограничение = 10 баллов
  3. Ограничение ширины = (UIScreen.main.bounds.width * 0.5)
  4. Высотаconstraint = (UIScreen.main.bounds.width * 0.5)

Внутри файла пользовательской ячейки табличного представления MainView, где пользовательское представление инициализируется с рамкой, я вместо этого инициализировал пользовательское представление с рамкойНЕ РАВНО РАМКУ И РАСПОЛОЖЕНИЮ ВИДА ШАБЛОНА, но с CGRect [origin 0, 0], шириной и высотой [widthConstraint.constant, heightConstraint.constant].

Я устанавливаю постоянные значенияограничения непосредственно перед вызовом функции CustomView.init (frame :), и представления были размещены правильно.

...