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
Ответы
Ответ 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 рекомендует использовать способ автоопределения с именем
Поэтапное принятие автоопределения
Это означает, что компоновка проста, вы можете использовать авторезистировку. И это приведет к ограничениям во время выполнения.
Таким образом, одним из решений является использование авторезистентности, и вы можете получить правую рамку вокруг представления в любое время. Но предпосылка заключается в том, что авторезистор может удовлетворить ваш макет.