Вы можете go "путь" автопластинга как vacawama ( Как получить точно такую же точку на разных размерах экрана? ) или реализовать и переопределить
-(void)layoutSubviews { ... } //with Objective-C
override func layoutSubviews() { ... } //with swift
из вашего UIView
. Или, если вы использовали UIViewControler
, следующие
-(void)viewDidLayoutSubviews { ... } //in Objective-C
override func viewDidLayoutSubviews() { ... } //with swift
Эти методы вызываются, когда пользовательскому интерфейсу необходимо разметить свое содержимое, а также, если ваше представление масштабируется. Он также вызывается, когда вашему UIView выделяется -(instancetype)initWithFrame:(CGRect)rect
в Objective- C или super.init(frame:CGRect)
в swift. Кстати, создание экземпляра с помощью Storyboard также вызывает эти методы, что является одной из причин, по которой вы объявляете в Interface Builder, какой класс отброшен UIView или ViewController.
Чтобы узнать больше о layoutSubviews, посмотрите этот ответ { ссылка }.
class MyView: UIView {
// assuming you have declared init() and so on
// and a var myButton : UIButton
override func layoutSubviews() {
myButton.frame = CGRect(x: 0, y:0, width:self.frame.size.width * 0.2, height:self.frame.size.height * 0.2)
}
}
class MyViewController : UIViewController {
// assuming you have declared init() or init(frame:) and so on
// and a var myButton : UIButton
override func viewDidLayoutSubviews() {
//same as example above, but here you ask self.view.frame
myButton.frame = CGRect(x: 0, y:0, width:self.view.frame.size.width * 0.2, height:self.view.frame.size.height * 0.2)
}
}