UIImageView .scaleAspectFit和自动布局无法从Swift以编程方式工作 [英] UIImageView .scaleAspectFit and autolayout not working programmatically from Swift

查看:104
本文介绍了UIImageView .scaleAspectFit和自动布局无法从Swift以编程方式工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个部分透明的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的属性检查器中,我将"Content Mode"设置为"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层次结构时

When I use Xcode to debug the Debug View Hierarchy

下面的链接图像显示:

  1. 对父包装UIView的约束.
  2. 通过情节提要创建的UIImageView上的约束.
  3. 通过Swift创建的UIImageView约束.

约束值

推荐答案

在控制台日志中,这两行告诉您正在发生的事情:

In your console log, these two lines tell you what's happening:

(注意:如果您看到的是NSAutoresizingMaskLayoutConstraints 不了解,请参阅有关UIView属性的文档

(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以编程方式工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆