所以,我有這個ViewController在子視圖中渲染影像的地方。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let childView = UIView()
childView.backgroundColor = .red
let imageView = UIImageView(image: UIImage(systemName: "tray"))
imageView.contentMode = .scaleAspectFill
childView.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
imageView.heightAnchor.constraint(equalToConstant: 100.0)
])
view.addSubview(childView)
childView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
childView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor)
])
}
}
正如您所看到的,由于某種原因,影像移動到了螢屏的左側。那是什么原因呢?

我注意到的另一件事是子視圖應該具有指定的紅色背景色,但不知何故它是透明的。這是為什么?
我希望結果是這樣的,

uj5u.com熱心網友回復:
您添加的約束太少了。的水平位置和大小childView完全沒有約束,所以大小只是默認為(0, 0),使得視圖根本不可見,這就是為什么你看不到紅色背景的原因。
首先,讓我們限制水平位置。這似乎是你的意圖:
NSLayoutConstraint.activate([
// wouldn't it be better to use safeAreaLayoutGuide?
childView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
childView.leftAnchor.constraint(equalTo: view.layoutMarginsGuide.leftAnchor)
])
然后, 的大小childView應該與 相同imageView,因此您也應該激活這些約束:
imageView.leftAnchor.constraint(equalTo: childView.leftAnchor),
imageView.rightAnchor.constraint(equalTo: childView.rightAnchor),
imageView.topAnchor.constraint(equalTo: childView.topAnchor),
imageView.bottomAnchor.constraint(equalTo: childView.bottomAnchor),
還有一件事 - 此時影像視圖的大小不是你所期望的。影像視圖的高度為 100,但其寬度仍為 24,這是“托盤”影像的固有大小。scaleAspectFill確實將影像縮放到您想要的大小,但視圖的寬度保持在 24,并且由于縮放是從視圖的中心完成的,縮放后的影像似乎“偏心”。
我認為一般來說,你只需要手動計算你想要的寬度:
let width = 100 * image.size.width / image.size.height
并約束寬度和高度:
imageView.heightAnchor.constraint(equalToConstant: 100.0),
imageView.widthAnchor.constraint(equalToConstant: width),
但是,使用 SF 符號,您可以通過以下方式獲得更大的影像:
let image = UIImage(systemName: "tray", withConfiguration: UIImage.SymbolConfiguration(pointSize: 100))
您不需要對影像視圖進行任何高度或寬度限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399930.html
