我有几个部分透明的 PNG 叠加层可以在视图中相互叠加显示.覆盖的数量取决于运行时条件.我想在 Swift 中创建 UIImageView
实例并将它们添加到视图中.
I have several partly transparent PNG overlays to display overlaying one another in a view. The number of overlays varies depending on runtime conditions. I want to create the UIImageView
instances in Swift and add them to the view.
在情节提要中添加 UIImageView
并通过 Swift 设置其图像时,我可以轻松获得我想要的行为.在这种情况下,我将 UIImageView
的前导、尾随、顶部和底部固定到父包装器 UIView
的前导、尾随、顶部和底部.在 UIImageView
的属性检查器中,我将内容模式"设置为Aspect Fit",当 Swift 设置图像时,大图像会很好地缩小.用户可以在 iPhone 的小屏幕上看到整个图像.
I don't have any trouble getting the behaviour I want when adding an UIImageView
in the storyboard and setting its image via Swift. In such a case, I pin the leading, trailing, top, and bottom of the UIImageView
to the leading, trailing, top, and bottom of the parent wrapper UIView
. In the attribute inspector for the UIImageView
, I set "Content Mode" to "Aspect Fit" and the large image is scaled down nicely when Swift sets the image. The user can see the whole image on the little iPhone screen.
当我动态创建 UIImageView
并将其添加到同一个父包装器 UIView
时,我遇到了约束问题.有太多的约束需要满足.
When I dynamically create a UIImageView
and add it to the same parent wrapper UIView
, I'm having a problem with constraints. There are too many constraints to satisfy.
我不明白为什么通过 Swift 创建的 UIImageView
与通过情节提要创建的 UIImageView
不同.
I cannot figure out why the UIImageView
created via Swift is different from the UIImageView
created via the storyboard.
如何让通过 Swift 创建的 UIImageView
的行为与通过情节提要创建的 UIImageView
一样?
How can I get the UIImageView
created via Swift to behave just like the UIImageView
created via the storyboard?
在通过情节提要创建的 UIImageView
和通过 Swift 创建的 UIImageView
上设置图像的 Swift 代码.
The Swift code that sets the image on the UIImageView
created via the storyboard and the UIImageView
created via 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 中看到的输出.
The output I see in Xcode when the layout manager is trying to satisfy conflicting constraints.
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 时
When I use Xcode to debug the Debug View Hierarchy
以下链接图片显示:
约束值
在你的控制台日志中,这两行告诉你发生了什么:
In your console log, these two lines tell you what's happening:
(注意:如果您看到 NSAutoresizingMaskLayoutConstraints不明白,参考UIView属性的文档translatesAutoresizingMaskIntoConstraints)
(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(活动)
NSAutoresizingMaskLayoutConstraint:0x17009cc50 h=--& v=--& UIImageView:0x101432d20.midY == 877.5 (active)
将此行添加到您的代码中将解决问题:
Adding this line to your code will fix things:
swiftImageView.translatesAutoresizingMaskIntoConstraints = false
这篇关于UIImageView .scaleAspectFit 和自动布局无法从 Swift 以编程方式工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!