Ограничение автоматической компоновки на CALayer IOS

Привет, я разрабатываю приложение для iPhone, в котором я попытался установить одну границу для edittext. Я сделал это следующим образом:

int borderWidth = 1; CALayer *leftBorder = [CALayer layer]; leftBorder.borderColor = [UIColor whiteColor].CGColor; leftBorder.borderWidth = borderWidth; leftBorder.frame = CGRectMake(0, textField.frame.size.height - borderWidth, textField .frame.size.width, borderWidth); [textField.layer addSublayer:leftBorder]; 

Я наложил некоторые ограничения на мой edittext в IB, так что, когда я вращаю свое устройство, он будет регулировать ширину текстового поля в соответствии с этим. Моя проблема в том, что настройка ширины edittext не регулирует ширину CALayer, которую я установил для своего текста редактирования. Поэтому я думаю, что я должен установить некоторые ограничения для моего объекта CALayer. Но я не знаю, как это сделать. Кто-нибудь знает об этом? Нужна помощь. Спасибо.

весь бизнес авторезистентности зависит от вида. слои не авторезистируются.

что вам нужно сделать – в коде – изменить размер слоя самостоятельно

например

в viewController вы бы сделали

 - (void) viewDidLayoutSubviews { [super viewDidLayoutSubviews]; //if you want superclass's behaviour... // resize your layers based on the view's new frame self.editViewBorderLayer.frame = self.editView.bounds; } 

или в пользовательском UIView, который вы можете использовать

 - (void)layoutSubviews { [super layoutSubviews]; //if you want superclass's behaviour... (and lay outing of children) // resize your layers based on the view's new frame layer.frame = self.bounds; } 

Проверьте это решение. Используйте KVO для пути «YourView.bounds», как показано ниже.

 self.addObserver(self, forKeyPath: "YourView.bounds", options: .New, context: nil) 

Затем обработайте его, как показано ниже.

 override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if (keyPath == "YourView.bounds") { YourLayer.frame = YourView.bounds return } super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) } 

Для получения дополнительной информации см. Следующую ссылку.

https://theswiftdev.com/2015/03/28/auto-layout-with-layers/

Я реализовал метод layoutSubviews моего пользовательского представления; внутри этого метода я просто обновляю каждый фрейм подуровня, чтобы он соответствовал текущим границам слоя моего subview.

 -(void)layoutSubviews{ sublayer1.frame = self.layer.bounds; } 

У меня была аналогичная проблема – мне нужно установить кадр «CALayer» при использовании автоматического макета с представлениями (в коде, а не в IB ).

В моем случае у меня была слегка свернутая иерархия, имеющая контроллер вида в контроллере представления. Я закончил этот вопрос SO и рассмотрел подход использования viewDidLayoutSubviews . Это не сработало. На всякий случай ваша ситуация похожа на мою, вот что я нашел …

обзор

Я хотел установить фрейм для CAGradientLayer UIView который я позиционировал как UIViewController в UIViewController с использованием ограничений автоматического макета.

Вызовите subview gradientView и контроллер просмотра child_viewController .

child_viewController был контроллером представления, который я настроил как своего рода повторно используемый компонент. Таким образом, view child_viewController составлялось в контроллер родительского представления – вызов parent_viewController .

Когда viewDidLayoutSubviews child_viewController , frame gradientView еще не установлен.

(В этот момент я бы рекомендовал разбрызгивать некоторые заявления NSLog чтобы получить представление о последовательности создания представлений в вашей иерархии и т. Д.)

Поэтому я перешел к использованию viewDidAppear . Однако из-за вложенного характера child_viewController я обнаружил, что viewDidAppear не вызывался.

(См. Этот вопрос SO: viewWillAppear, viewDidAppear не вызывается, а не стреляет ).

Мое текущее решение

Я добавил viewDidAppear в parent_viewController и оттуда я viewDidAppear в child_viewController .

Для начальной загрузки мне нужен viewDidAppear поскольку это не до тех пор, пока в child_viewController не будет child_viewController что все child_viewController имеют свои фреймы. Затем я могу установить кадр для CAGradientLayer

Я сказал, что это мое текущее решение, потому что я не очень доволен этим.

После первоначальной установки кадра CAGradientLayer – этот кадр может стать недействительным, если макет изменится – например, вращение устройства.

Для этого я использую viewDidLayoutSubviews в child_viewController – чтобы сохранить кадр CAGradientLayer в gradientView , исправьте.

Он работает, но не чувствует себя хорошо. (Есть ли способ лучше?)

Interesting Posts
Давайте будем гением компьютера.