2017-01-29 5 views
0

Я изучаю swift с cs193p, и у меня есть проблема с UITextView.sizeThatFits(...). Он должен возвращать рекомендуемый размер для всплывающего представления, чтобы отобразить массив [int] в виде текста. Как вы можете видеть в примере Пола Хегарти (https://youtu.be/gjl2gc70YHM?t=1h43m17s), он получает совершенно подходящее окно без полосы прокрутки. Я использую почти один и тот же код, который был в этой лекции, но вместо этого я получил это:Почему sizeThatFits() возвращает слишком маленький размер?

enter image description here

text строка равна [100], но метод sizeThatFits() возвращает размер, который слишком мал, чтобы показать его красиво, хотя есть много свободного места. Это становится немного лучше после того, как я добавил текст, но до сих пор не точны и с скроллинга:

enter image description here

Вот часть кода, где размер создается:

override var preferredContentSize: CGSize { 
    get { 
     if textView != nil && presentingViewController != nil { 
     // I've added these outputs so I can see the exact numbers to try to understand how this works 
      print("presentingViewController!.view.bounds.size = \(presentingViewController!.view.bounds.size)") 
      print("sizeThatFits = \(textView.sizeThatFits(presentingViewController!.view.bounds.size))") 
      return textView.sizeThatFits(presentingViewController!.view.bounds.size) 
     } else { return super.preferredContentSize } 
    } 
    set { super.preferredContentSize = newValue } 
} 

Что я должен делать, это будет работать так же, как и в лекции?

ответ

1

Похоже, что между ярлыком и его родительским видом имеется 16 pt полей. Это необходимо учитывать при возврате предпочтительного размера popover.

Вы должны попробовать оба из следующих действий:

  • Добавить 32 в ширину, который возвращается из preferredContentSize

  • В Interface Builder, снимите ограничения макета на вашем UILabel, а затем повторно добавить сверху , нижнего, ведущего и конечного ограничений и убедитесь, что опция «Ограничить маржи» не включена.

Наконец, вместо переопределения preferredContentSize, вы можете просто установить preferredContentSize, когда ваш взгляд готов показать, и вы можете спросить Auto Layout, чтобы выбрать лучший размер:

override func viewDidLayoutSubviews() { 
    self.preferredContentSize = self.view.systemLayoutSizeFitting(UILayoutFittingCompressedSize) 
} 

Если ваш макет настроен правильно, systemLayoutSizeFitting(UILayoutFittingCompressedSize) вернет наименьший возможный размер для вашего вида, с учетом всех полей и под-представлений.

+0

Благодарим за консультацию. Мой 'UITextView' уже был привязан к полям: ' Text View.top = Top Layout Guide.bottom; Текст View.leading = leadingMargin; Текст View.trailing = trailingMargin; Bottom Layout Guide.top = Text View.bottom; ' И я изменил его на ' Text View.leading = leadingMargin - 20; Текст View.trailing = trailingMargin + 20; ' (сверху и снизу остались без изменений), теперь он работает правильно. Итак, проблема заключалась в том, что я думал, что должен ограничивать свой «UITextView» синими линиями, предложенными Xcode (включая маржу) вместо краев экрана. – smocer

 Смежные вопросы

  • Нет связанных вопросов^_^