#ios #swift #uiimageview
#iOS #swift #uiimageview
Вопрос:
У меня возникла проблема с созданием круга UIImageView
. Если бы я вручную установил corderRadius
значение, например. 50, у него был бы закругленный угол. Но когда я пытаюсь установить его равным половине высоты или ширины фрейма ( frame.width / 2
или frame.height / 2
), это не работает. Каким-то образом, рамка появляется (0, 0, 0, 0)
, когда я пытаюсь ее распечатать.
И вот мой код,
import UIKit
class TestIconController : UIViewController {
let icon: UIImageView = {
let imageView = UIImageView()
imageView.layer.cornerRadius = imageView.frame.width / 2
imageView.clipsToBounds = true
imageView.layer.masksToBounds = true
imageView.backgroundColor = .red
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
}()
override func viewDidLoad() {
super.viewDidLoad()
loadLogo()
}
func loadLogo() {
view.addSubview(icon)
// Constraints
icon.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
icon.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
icon.heightAnchor.constraint(equalToConstant: 200).isActive = true
icon.widthAnchor.constraint(equalToConstant: 200).isActive = true
}
}
Комментарии:
1. Это потому, что вы не устанавливаете прямоугольник (frame) в
imageView
.2. Добавьте комментарий к @ElTomato .. Используйте
Lazy var
в подобных ситуациях.
Ответ №1:
Переопределите эту функцию.
override func viewDidLayoutSubviews() {
icon.layer.cornerRadius = icon.bounds.size.width / 2
icon.clipsToBounds = true
icon.layer.masksToBounds = true
}
Комментарии:
1. Это сработало! Почему это icon.bounds вместо frame?
2. Вы также можете использовать фрейм вместо границ.
3. Я понимаю. Я действительно пытался это сделать, но почему-то это не сработало для моего реального проекта. Возможно, потребуется проверить это еще раз. В любом случае, спасибо! PS: Я думаю, потому что я использовал viewWillLayoutSubviews вместо viewDidLayoutSubviews
Ответ №2:
Вы также можете создать для него базовый класс для обработки теста; Например
class UICirlceImageView : UIImageView {
override open func layoutSubviews() {
super.layoutSubviews();
let layer:CALayer = self.layer;
layer.cornerRadius = self.frame.size.width/2.0;
layer.masksToBounds = true;
}
}
затем сделайте это следующим образом
//let icon: UICirlceImageView = { // You may initialize like this as well
let icon: UIImageView = {
let imageView = UICirlceImageView()
imageView.backgroundColor = .red
//imageView.translatesAutoresizingMaskIntoConstraints = false // Don't know if it is needed
return imageView
}()
Примечание: Ответ, данный Rushabh, также правильный.
Ответ №3:
Вы можете создать эти расширения
extension UIImageView {
func setRounded() {
self.layer.cornerRadius = self.frame.width / 2
self.layer.masksToBounds = true
self.clipsToBounds = true
}
}
В вашем случае вы можете внутри viewDidLayoutSubviews вызвать
icon.setRounded()