【问题标题】:UIImageView frame not placing correctly on the parent ImageViewUIImageView 框架未正确放置在父 ImageView 上
【发布时间】:2020-09-30 22:54:10
【问题描述】:

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

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

我使用的代码如下

 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的,我不知道为什么会这样,需要帮助

【问题讨论】:

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

标签: ios objective-c swift uiimageview coordinates


【解决方案1】:

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

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

  • viewDidLoad()中添加“圆形加号”图标imageView
  • 将其frame.origin 设置为viewDidLayoutSubviews()viewDidAppear()

【讨论】:

    【解决方案2】:

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

    应该是:

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

    轴是:

    0,0-----------------> x

    | ▢

    |

    |

    |

    V

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

    【讨论】:

    • 是的,如果我给 (0,0) 那么它工作正常。如果我给 (x=0, y=cHeight),那么小图标应该在左下角,但它不会在左下角,这就是问题
    【解决方案3】:

    您可以通过将height 属性修改为超级视图的边界高度来解决此问题。您需要知道framebounds 之间的区别才能理解为什么会这样。简单来说,frame 是 CGRect 相对于它的超级视图,bounds 是 CGRect 相对于它自己的坐标。 网上有很多详细的解释,只需要google frame vs bounds,在你玩过很多次之后你就会习惯这两个。 以下是解决此问题的方法。

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

    【讨论】:

    • 我之前试过这个,看到你的答案后我也试过了,但它没有出现在左下角,它就像第二张图片(有问题)一样
    • 你可以尝试修改 addSubview 这个:colorPalleteImageView.addSubview(imageView) 到这个:colorPalleteImageView.superview?.addSubview(imageView)
    • 当然,让我试试
    • 它超出了 colorPalleteImageView(即它的超级视图)并且 plusIcon 没有到达左下角,仅与第二张图像(有问题)保持相同的位置
    • 我不明白。你在这里做别的事吗?也许问题中没有提供整个上下文,或者你没有完全按照我告诉你的那样做。只需尝试在 cHeight 中提供 frame.size.height 并按照我所说的添加 imageView 进行检查。
    【解决方案4】:

    对不起……我回来了

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

    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 上)

    【讨论】:

    • 很高兴看到这一点,但问题是,我在 xib 中创建了 colorImageView 并通过编程方式创建了 plusIconImageView,请您尝试一下,让我知道它是怎么来的吗?我认为如果我以编程方式创建两个图像,那么它会正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2019-12-17
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多