gpt4 book ai didi

ios - UIImageView .scaleAspectFit 和自动布局无法从 Swift 以编程方式工作

转载 作者:可可西里 更新时间:2023-11-01 00:40:40 26 4
gpt4 key购买 nike

我有几个部分透明的 PNG 叠加层,以在 View 中相互叠加显示。覆盖的数量因运行时条件而异。我想在 Swift 中创建 UIImageView 实例并将它们添加到 View 中。

在 Storyboard 中添加 UIImageView 并通过 Swift 设置其图像时,我可以轻松获得所需的行为。在这种情况下,我将 UIImageView 的前导、尾随、顶部和底部固定到父包装器 UIView 的前导、尾随、顶部和底部。在 UIImageView 的属性检查器中,我将“Content Mode”设置为“Aspect Fit”,当 Swift 设置图像时,大图像会很好地缩小。用户可以在 iPhone 的小屏幕上看到整个图像。

当我动态创建一个 UIImageView 并将其添加到同一父包装器 UIView 时,我遇到了约束问题。需要满足的约束条件太多。

我不明白为什么通过 Swift 创建的 UIImageView 与通过 Storyboard创建的 UIImageView 不同。

如何让通过 Swift 创建的 UIImageView 的行为与通过 Storyboard创建的 UIImageView 一样?

在通过 Storyboard创建的 UIImageView 和通过 Swift 创建的 UIImageView 上设置图像的 Swift 代码。

override func viewDidLoad() -> Void {
super.viewDidLoad();

let imageFilePath: String = Bundle.main.resourceURL!.appendingPathComponent("img/a.png", isDirectory: false).path;

// Use the outlet to set the image in the UIImageView created in the storyboard.
// This works.

self.storyboardImageView.image = UIImage(contentsOfFile: imageFilePath);

// Create a UIImageView programatically and add it to the same wrapper UIView
// that also contains the UIImageView above.
// This doesn't work.

let swiftImageView: UIImageView = UIImageView(image: UIImage(contentsOfFile: imageFilePath));

// The presence of the following line makes no difference
//
swiftImageView.contentMode = .scaleAspectFill;

self.storyboardWrapperView.addSubview(swiftImageView);

swiftImageView.topAnchor.constraint(equalTo: self.storyboardWrapperView.topAnchor).isActive = true;
swiftImageView.bottomAnchor.constraint(equalTo: self.storyboardWrapperView.bottomAnchor).isActive = true;
swiftImageView.leadingAnchor.constraint(equalTo: self.storyboardWrapperView.leadingAnchor).isActive = true;
swiftImageView.trailingAnchor.constraint(equalTo: self.storyboardWrapperView.trailingAnchor).isActive = true;

当布局管理器试图满足冲突约束时,我在 Xcode 中看到的输出。

2017-05-17 22:45:18.351141-0700 My App[29787:7263069] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x170096670 h=--& v=--& UIImageView:0x101432d20.midX == 540 (active)>",
"<NSLayoutConstraint:0x174092520 H:|-(0)-[UIView:0x101439120] (active, names: '|':UIView:0x10142f4a0 )>",
"<NSLayoutConstraint:0x174092570 H:[UIView:0x101439120]-(0)-| (active, names: '|':UIView:0x10142f4a0 )>",
"<NSLayoutConstraint:0x1740936a0 H:|-(0)-[UIImageView:0x101432d20] (active, names: '|':UIView:0x101439120 )>",
"<NSLayoutConstraint:0x174093790 UIImageView:0x101432d20.trailing == UIView:0x101439120.trailing (active)>",
"<NSLayoutConstraint:0x17009b260 'UIView-Encapsulated-Layout-Width' UIView:0x10142f4a0.width == 375 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x174093790 UIImageView:0x101432d20.trailing == UIView:0x101439120.trailing (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2017-05-17 22:45:18.360996-0700 My App[29787:7263069] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<_UILayoutSupportConstraint:0x174091cb0 _UILayoutGuide:0x10143e8d0.height == 0 (active)>",
"<_UILayoutSupportConstraint:0x174092930 V:|-(0)-[_UILayoutGuide:0x10143e8d0] (active, names: '|':UIView:0x10142f4a0 )>",
"<_UILayoutSupportConstraint:0x174091da0 _UILayoutGuide:0x10143ddc0.height == 0 (active)>",
"<_UILayoutSupportConstraint:0x174091490 _UILayoutGuide:0x10143ddc0.bottom == UIView:0x10142f4a0.bottom (active)>",
"<NSAutoresizingMaskLayoutConstraint:0x17009cc50 h=--& v=--& UIImageView:0x101432d20.midY == 877.5 (active)>",
"<NSLayoutConstraint:0x174092660 V:[_UILayoutGuide:0x10143e8d0]-(0)-[UIView:0x101439120] (active)>",
"<NSLayoutConstraint:0x1740927a0 V:[UIView:0x101439120]-(0)-[_UILayoutGuide:0x10143ddc0] (active)>",
"<NSLayoutConstraint:0x174093380 V:|-(0)-[UIImageView:0x101432d20] (active, names: '|':UIView:0x101439120 )>",
"<NSLayoutConstraint:0x174093650 UIImageView:0x101432d20.bottom == UIView:0x101439120.bottom (active)>",
"<NSLayoutConstraint:0x170098830 'UIView-Encapsulated-Layout-Height' UIView:0x10142f4a0.height == 667 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x174093650 UIImageView:0x101432d20.bottom == UIView:0x101439120.bottom (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

当我使用 Xcode 调试 Debug View Hierarchy 时

以下链接图片显示:

  1. 父包装器 UIView 的约束。
  2. 通过 Storyboard创建的 UIImageView 的约束。
  3. 对通过 Swift 创建的 UIImageView 的约束。

constraint values

最佳答案

在您的控制台日志中,这两行告诉您发生了什么:

(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)

.

NSAutoresizingMaskLayoutConstraint:0x17009cc50 h=--& v=--& UIImageView:0x101432d20.midY == 877.5 (active)

将这一行添加到您的代码中将解决问题:

swiftImageView.translatesAutoresizingMaskIntoConstraints = false

关于ios - UIImageView .scaleAspectFit 和自动布局无法从 Swift 以编程方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44039852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com