Подтвердить что ты не робот

CornerRadius перестала работать в Swift 2.3/iOS 10/Xcode 8

У меня есть cornerRadius, установленный на UIView и a UIImageView внутри одного и того же UIView. Я вычисляю радиус угла с помощью RockProfileView.frame.size.height / 2, но UIView перестает отображаться в iOS 10.

После дополнительной проверки я обнаружил, что значение RockProfileView.frame.size.height / 2 выходит равным 1000,0, а ограничение ширины и высоты равно 64.0

Когда я жестко закодировал RockProfileView.layer.cornerRadius = 32 до 64/2, он работает нормально.

В чем может быть проблема?

Полный код:

    RockProfileView.layer.cornerRadius = RockProfileView.frame.size.height / 2
    RockProfileView.clipsToBounds = true
    RockProgressView.layer.masksToBounds = true
4b9b3361

Ответ 1

Как ответил Роб, я переместил код с viewDidLoad в viewDidAppear, и проблема исправлена.

ИЛИ Добавление self.view.layoutIfNeeded() до того, как ваш код в viewDidLoad также решит проблему.

В случае UITableViewCell внутри awakeFromNib добавить [self layoutIfNeeded]; перед обновлением радиус угла должен решить все проблемы.

Ответ 2

Я сделал этот код в awakeFromNib, но после обновления до ios 10 + xcode 8 он прекратил работу.

Затем я переместил этот код в метод layoutSubViews. Тогда это сработало.

В надежде, это будет полезно для вас.

Если вы все еще хотите сделать это в awakefromnib, сделайте это после некоторой задержки (с помощью dispatch_after или NSOperatinQueue или выполнитеSelectorWithDelay)

Ответ 3

Если он находится внутри вашего одного из ViewControllers, вместо перемещения всех операций слоя на viewDidLayer, переместите этот код внутри DispatchQueue. Это сработало для меня:

DispatchQueue.main.async {
            let layer = self.signUpBtn.layer
            layer.borderColor = UIColor.white.cgColor
            layer.borderWidth = 2 / UIScreen.main.scale
        }

Надеюсь, это поможет вам.

Ответ 4

Новая вещь в XCode8 мы не можем напрямую установить cornerRadius слоя.

Если вы хотите применить cornerRadius UIView, необходимо добавить одну строку кода перед применением cornerRadius.

yourButton.layoutIfNeeded()

Пример в Object C.

[yourButton layoutIfNeeded];
yourButton.layer.cornerRadius = yourButton.frame.size.height/2;
[[yourButton layer] setBorderWidth:2.0f];
Example into Swift3

self.layoutIfNeeded()
yourButton.layer.cornerRadius = self.frame.height / 2.0
yourButton.layer.borderWidth = 2.0

Ответ 5

Для меня это было первым вызовом layoutIfNeeded, а позже на set cornerRadius

Ответ 6

swift 3

Я попробую этот код определить угловой радиус UIImageview

 imgProfile.layer.cornerRadius = imgProfile.frame.size.width / 2
            imgProfile.clipsToBounds = true

Ответ 7

Отмечено с помощью @IBInspectable в swift (или IBInspectable в Objective-C), они легко редактируются в панели инспекторов атрибутов Interface Builders.
Вы можете напрямую установить cornerRadius в инспекторе атрибутов

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }
}

Ответ 8

У меня была такая же проблема, только для iOS 10. Я обнаружил, что ViewDidLayoutSubviews или ViewDidLoad (возможно, другие, но я не проверял) работал только, если я завернул код макета в очереди отправки, как предполагал YPK.

Я использую Xamarin, поэтому синтаксис немного отличается:

DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            SetYourViewProperties();
        });

Ответ 9

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

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});

Ответ 10

Как уже упоминалось в предыдущем ответе, добавление self.layoutIfNeeded() перед изменением радиуса угла работало для меня.

Ответ 11

Решение Swift 3.2

В случае, если у кого-то еще есть эта проблема, я решил проблему, округляя ячейки (или любые ее подзоны) в viewDidLayoutSubviews.

override func viewDidLayoutSubviews() {
    if (tableView.visibleCells.count > 0) {
        for cell in tableView.visibleCells {
            let customCell = cell as! CustomCell
            // Use any rounding method you use
            customCell.exampleSubview.roundCorners(corners: .allCorners, radius: 6) 
            customCell.exampleSubview.layoutIfNeeded()
        }
    }
}

Ответ 12

В WWDC 2016 | Что нового в Auto Layout, Apple рекомендует использовать способ автоопределения с именем

Поэтапное принятие автоопределения

Это означает, что компоновка проста, вы можете использовать авторезистировку. И это приведет к ограничениям во время выполнения.

Таким образом, одним из решений является использование авторезистентности, и вы можете получить правую рамку вокруг представления в любое время. Но предпосылка заключается в том, что авторезистор может удовлетворить ваш макет.