Новый взгляд на iphone 8 и iphone x

Проблема с текстовым представлением, созданным программно. Он просто выскакивает до ~ 20 пикселей на iPhoneX, но выглядит идеально на iPhone 8. Буду очень признателен за любые подсказки :) Скриншоты прилагаются.

iPhoneX: http://prntscr.com/lcnh2y iPhone 8: http://prntscr.com/lcnhns

Код:

let rect = CGRect(x: 20, y: self.tabsSegmentedControl.layer.position.y + 20, width: self.tabsSegmentedControl.layer.frame.width, height: 127)
    self.ingredientsTextView = UITextView(frame: rect)
    ingredientsTextView.isEditable = false
    ingredientsTextView.isSelectable = false
    self.view.addSubview(ingredientsTextView)

Как вкладка SegmentedControl создается кодом или программно?

Sateesh Yemireddi 31.10.2018 12:59

вкладки SegmentedControl создается в редакторе раскадровки. В нем есть все необходимые ограничения.

Sergey Poprovka 31.10.2018 13:01

Можете ли вы опубликовать код, в котором вы добавляете ограничение в текстовое представление?

ebby94 31.10.2018 13:35

Для textview нет особых ограничений. Он расположен в коде выше. Только segmentedBar теперь имеет ограничения. И textview принимает self.tabsSegmentedControl.layer.position.y + 20 в качестве значения Y

Sergey Poprovka 31.10.2018 13:39

Поделитесь скриншотом того, как ограничения добавляются в tabsSegmentedControl

Sateesh Yemireddi 31.10.2018 13:42

Каким методом вы добавляете это текстовое представление?

Datt Patel 31.10.2018 13:53
prntscr.com/lcoc0j
Sergey Poprovka 31.10.2018 13:54

Метод, который я использую для добавления textView, написан в исходном посте. Это единственный код для его создания, и он используется в viewDidLoad ()

Sergey Poprovka 31.10.2018 13:55

Используйте метод viewWillLayoutSubviews (), чтобы добавить текстовое представление. Это может решить вашу проблему.

Datt Patel 31.10.2018 13:59

Нет, не используйте viewWillLayoutSubviews для добавления чего-либо. Используйте его только для фактического макета подвидов, если вам это нужно. Проблема, с которой вы, вероятно, столкнулись, заключается в том, что сегментированный элемент управления настраивает свое положение из-за безопасной области, но это происходит после настройки текстового представления, поэтому фрейм неверен. Я бы предложил использовать ограничения для текстового представления вместо фиксированного фрейма.

Upholder Of Truth 31.10.2018 14:03
1
10
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте viewDidLoad для создания и WillLayout для позиционирования. Я не рекомендую смешивать раскадровку и программное создание пользовательского интерфейса.

class ViewController: UIViewController {

@IBOutlet weak var tabsSegmentedControl: UISegmentedControl!

var ingredientsTextView : UITextView!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ingredientsTextView = UITextView(frame: .zero)
    self.view.addSubview(ingredientsTextView)
    ingredientsTextView.isEditable = false
    ingredientsTextView.isSelectable = false
}

override func viewWillLayoutSubviews() {
    let rect = CGRect(x: 20, y: self.tabsSegmentedControl.frame.maxY + 20, width: self.tabsSegmentedControl.frame.width, height: 127)
    ingredientsTextView.frame = rect
    ingredientsTextView.text = "There is a problem with the text view that's been programmatically created. It just pops up to ~20px at iPhoneX, but looks perfect at iPhone 8. I'll be super grateful for any hints :) Screenshots attached."
}

}

Другие вопросы по теме