UIImageView 帧未正确放置在父 ImageView 上

UIImageView frame not placing correctly on the parent ImageView

提问人:R. Mohan 提问时间:6/11/2020 最后编辑:R. Mohan 更新时间:6/11/2020 访问量:745

问:

我有一个调色板 imageview,因为我想根据我从后端获得的 x 轴和 y 轴放置一个加号图标 (imageView)。如果我得到 x = 0 和 y = 0,则加号的帧放置正确

x=0,y=0

对于 y 轴,如果我将调色板 imageView 的高度设置为加号图标的框架的 y 轴,则图标不会变为实际 (0,0)

x=0,y=width.

我使用的代码如下

 let cWidth = self.colorPalleteImageView.frame.size.width // 348
 let cHeight = self.colorPalleteImageView.frame.size.height // 378.5

 let imageView = UIImageView(image: appImages.roundPlusIcon.image)
 imageView.frame = CGRect(x: 0, y: cHeight, width: 22, height: 22)
 colorPalleteImageView.addSubview(imageView)

我正在用 iPad 12.9 英寸模拟器检查这一点。我是否缺少任何东西来实现 x=0 和 y=0,如果我将 colorPaletteImage 的宽度提供给 plusIconImageView 的 x 轴,它不会在 x 轴上结束,它停留在 imageview 宽度的结束之前,我不知道为什么会这样,需要帮助

iOS Objective-C Swift UIImageView 坐标

评论

0赞 DonMag 6/11/2020
首先,为什么不使用自动布局和约束?第二,你什么时候这样做?例如,如果此代码在 中,则帧未完成设置。viewDidLoad()
0赞 R. Mohan 6/11/2020
@DonMag我认为如果我使用带有自动布局的加号图标,则无法动态移动框架,这就是以编程方式创建它的原因。我在viewWillAppear()中执行此操作。
0赞 DonMag 6/11/2020
布局未完成,这可能是您的问题。您的调色板 imageView 大小是固定的吗?还是会根据设备而变化?显示用于设置 imageView 框架的代码。viewWillAppear()
0赞 R. Mohan 6/11/2020
是的,你是对的,这就是问题所在。color-palette imageView 会根据设备而变化,现在我在 viewDidLayoutSubviews 中尝试了两次,它调用了两次并创建了两个加号图标,第二个的框架设置完美,如果我在 viewDidAppear 中设置了我的 imageView 的框架会解决我的问题吗?
1赞 DonMag 6/11/2020
我添加了这个作为答案,所以其他遇到这个问题的人会看到解决方案。

答:

0赞 ingconti 6/11/2020 #1

imageView.frame = CGRect(x: cWidth, y: cHeight, width: 22, height: 22)

桅杆是:

imageView.frame = CGRect(x: 0, y: 0, 宽度: 22, 高度: 22)

作为轴是:

0.0-----------------> 倍

|▢

|

|

|

V

使用 0,0 时,您将小图像的左上角放在大图像的左上角。

评论

0赞 R. Mohan 6/11/2020
是的,如果我给 (0,0),那么它工作正常。如果我给出 (x=0, y=cHeight),那么小图标应该在左下角,但它不会去左下角,这就是问题所在
0赞 Frankenstein 6/11/2020 #2

您可以通过将属性修改为超级视图的边界高度来解决此问题。您需要知道两者之间的区别,并了解为什么会发生这种情况。简单来说,框架是相对于其超级视图的 CGRect,边界是相对于其自身坐标的 CGRect。 网上有很多详细的解释,只需要谷歌框架与界限,在你玩了很多次之后,你就会习惯这两个。 以下是解决此问题的方法。heightframeboundsCGRect

let cHeight = self.colorPalleteImageView.bounds.size.height

评论

0赞 R. Mohan 6/11/2020
我之前试过这个,在看到你的答案后,我也试过了,但它没有出现在左下角,它只像第二张图片(有问题)一样出现
0赞 Frankenstein 6/11/2020
您可以尝试将addSubview this:修改为以下代码吗?colorPalleteImageView.addSubview(imageView)colorPalleteImageView.superview?.addSubview(imageView)
0赞 R. Mohan 6/11/2020
当然,让我试试
0赞 R. Mohan 6/11/2020
它超出了 colorPalleteImageView(即它的超级视图)和 plusIcon 没有出现在左下角,仅与第二张图像(有问题)保持相同的位置
0赞 Frankenstein 6/11/2020
我不明白。你在这里做别的事情吗?也许问题中没有提供整个上下文,或者你没有完全按照我告诉你的去做。只需尝试在 cHeight 中给出 frame.size.height,并按照我所说的方式添加 imageView 进行检查。
0赞 ingconti 6/11/2020 #3

不好意思。。我回来了

我做到了(为了遵循你的代码,我强制了值..)

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var colorPalleteImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let v = self.view
        print(v!.frame)

        let cHeight = CGFloat(378.5)

        colorPalleteImageView.frame.size.width = 348
        colorPalleteImageView.frame.size.height = cHeight

        let plusImg = UIImage(named: "plus")
        let imageView = UIImageView(image: plusImg)
        imageView.frame = CGRect(x: 0, y: cHeight-22, width: 22, height: 22)
        colorPalleteImageView.addSubview(imageView)

    }

}

我得到了:(在iPad上)

enter image description here

评论

0赞 R. Mohan 6/11/2020
很高兴看到这一点,但问题是,我通过编程方式在 xib 中创建了 colorImageView 和 plusIconImageView,您能否尝试一下,让我知道它是如何为您准备的?我认为如果我以编程方式创建两个图像,那么它会正常工作。
2赞 DonMag 6/11/2020 #4

在通过自动布局完成帧设置之前,您正在使用帧大小。

我建议使用约束,但如果你想坚持帧坐标......

  • 添加“圆形加号”图标 imageView inviewDidLoad()
  • 将其设置为 IN 或frame.originviewDidLayoutSubviews()viewDidAppear()