swift insertSubview()在UIStackView中的一个UIView上工作,但不在相邻视图上工作

jjjwad0x  于 2023-06-04  发布在  Swift
关注(0)|答案(1)|浏览(118)

我在故事板的自动布局工作,我有两个相邻的UIView在一个单一的UIStackView。我需要在两个UIView背景中插入图像。
问题是背景图像显示在左UIView中,而不是右UIView中。下面是代码。

extension UIView {
    
    func backgroundImage(image: String){
        let background = UIImage(named: image)
        
        var imageView : UIImageView!
        imageView = UIImageView(frame: self.frame)
        print(self.frame.origin.x)
        imageView.contentMode =  UIView.ContentMode.scaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = background
        imageView.center = self.center
        self.insertSubview(imageView, at: 0)
    }
}

private func loadViews() {
        leftCardView.backgroundImage(image: "green-card")
        rightCardView.backgroundImage(image: "purple-card")
    }

在viewDidAppear()中调用loadViews()。
下面是图片。

您可以看到,在视图检查器中,右UIView(紫色视图)背景不存在。我找了很多,但没有找到任何解决办法。

gk7wooem

gk7wooem1#

问题出在这一行:imageView.center = self.center。您正在将imageView的中心(在UIView坐标中)设置为UIView的中心(在UIStackView坐标中)。按@HangarRash的建议去做:将imageView的框架设置为self.bounds,并且不设置中心。

let imageView = UIImageView(frame: self.bounds)
imageView.center = self.center <- remove this

或者,像这样设置中心:

imageView.center = CGPoint(x: self.bounds.width / 2, y: self.bounds.height / 2)

这里有一个图表来解释。由于leftCardView和rightCardView是UIStackView的子视图,因此它们的中心相对于堆栈视图的原点。在我的例子中,center(x,y)=(64,64)和(232,64)用于左右卡片视图。由于imageView是UIView的子视图,因此它们的中心相对于UIView的原点。左边的imageView没有问题,但是右边的imageView在原始代码中被置于屏幕外。

对于修复,self.bounds.width / 2 = 64,self.bounds.height / 2 = 64,对于两个卡视图,将imageViews放置在其UIView的中心。

相关问题