Закругление углов UITextField во ViewDidLoad влияет только на левые углы

Я пытаюсь округлить верхнюю и нижнюю границу двух UITextField

Результат в ViewDidLoad()

Результат ViewDidLoad

Результат в ViewDidAppear

Результат ViewDidAppear

Проблема в том, что ViewDidAppear меняет границу через полсекунды загрузки представления, что в моей ситуации не очень хорошо,

кто-нибудь знает, почему в ViewDidLoad методе округляется только левый угол?

любые предложения приветствуются?

* Обновить *

viewDidLayoutSubviews совпадает с ViewDidLoad

Вот код, который я использую для скругления углов

extension UITextField {
    func roundCorners(corners:UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.layer.masksToBounds = true
        self.layer.mask = mask
    }
}

А также

self.FirstTextField.roundCorners(UIRectCorner.TopRight | UIRectCorner.TopLeft, radius: 10.0)
self.SecondTextField.roundCorners(UIRectCorner.BottomLeft | UIRectCorner.BottomRight, radius: 10.0)

person Amr Mohamed    schedule 20.07.2015    source источник
comment
как вы настроили текстовые поля   -  person Alaeddine    schedule 20.07.2015
comment
в StoryBoard с использованием AutoLayout   -  person Amr Mohamed    schedule 20.07.2015
comment
Правильно ли вы установили ограничения? Скорее всего, в этом проблема   -  person David Cao    schedule 20.07.2015
comment
С ограничениями все в порядке, я думал так же, но обнаружил, что проблема в скруглении углов.   -  person Amr Mohamed    schedule 20.07.2015
comment
@Aladin взгляни на обновление   -  person Amr Mohamed    schedule 20.07.2015
comment
@Panda, проверь мой ответ   -  person Alaeddine    schedule 20.07.2015


Ответы (3)


Единственное, что я когда-либо ожидал исправить, - это отправка в основную очередь.

dispatch_async(dispatch_get_main_queue(),{
      self.FirstTextField.roundCorners(UIRectCorner.TopRight | UIRectCorner.TopLeft, radius: 10.0)
      self.SecondTextField.roundCorners(UIRectCorner.BottomLeft | UIRectCorner.BottomRight, radius: 10.0)
});

Теперь я не знаю, может ли это быть неэффективным или нет, но да, это работает: D

если у кого-то есть лучший ответ, опубликуйте его :)

person Amr Mohamed    schedule 20.07.2015
comment
На самом деле это то, что вы должны делать, если вам нужно обновить пользовательский интерфейс не из основного потока (например, загружая изображение). Откуда вы вызывали метод раньше? - person David Cao; 20.07.2015
comment
я звонил нормально - person Amr Mohamed; 20.07.2015
comment
Мне тоже пришлось сделать это так: внесение изменений в viewWillAppear ничего не дало, и смотреть, как изображение формируется в круг после того, как интерфейс загружен в viewDidAppear, абсолютно безвкусно. Спасибо за это решение. - person Hobbyist; 25.01.2016

Попробуйте переместить свой код округления текстовых полей на - (void)viewDidLayoutSubviews

person Alaeddine    schedule 20.07.2015
comment
Тот же результат, что и ViewDidLoad, см. Обновленный вопрос, с той лишь разницей, что viewDidLayoutSubviews отлично работает, если повернуть устройство один раз @Aladin - person Amr Mohamed; 20.07.2015
comment
Вы имеете в виду viewWillLayoutSubviews? @ Аладин - person Amr Mohamed; 20.07.2015
comment
ViewControllers имеет только viewWillLayoutSubviews , так что вы это имеете в виду, но, к сожалению, то же, что и ViewDidLoad и viewDidLayoutSubviews @Aladin - person Amr Mohamed; 20.07.2015

Вам нужно, чтобы маска слоя находилась в границах

self.layer.masksToBounds = true

РЕДАКТИРОВАТЬ:

Попробуйте использовать & вместо |, я считаю, что он принимает только первый угол с тех пор, как вы использовали или.

self.FirstTextField.roundCorners(UIRectCorner.TopRight & UIRectCorner.TopLeft, radius: 10.0)
self.SecondTextField.roundCorners(UIRectCorner.BottomLeft & UIRectCorner.BottomRight, radius: 10.0)
person David Cao    schedule 20.07.2015
comment
Вы думаете так же, как и я :), я пробовал это раньше, но он вообще не закруглял :)): D - person Amr Mohamed; 20.07.2015
comment
Ага, у меня больше нет идей, извините! - person David Cao; 20.07.2015
comment
Я тоже застрял, не могу понять, это взорвало меня, но без проблем, я надеюсь, что скоро кто-нибудь поможет, спасибо за попытку помочь :) @David - person Amr Mohamed; 20.07.2015
comment
Послушайте, у меня есть идея, и она отлично работает, проверьте мой ответ - person Amr Mohamed; 20.07.2015