如何在确保 UIView 的内容在其框架内的同时将 UIview 添加到 imageView?

Posted

技术标签:

【中文标题】如何在确保 UIView 的内容在其框架内的同时将 UIview 添加到 imageView?【英文标题】:How do I add a UIview to an imageView while ensuring that the contents of the UIView are inside the it's frame? 【发布时间】:2015-05-08 15:04:08 【问题描述】:

我有一个包含ImageViewtestView 和一些按钮的超级视图。我创建了一个UIView,其中包含ImageView2 和一个removebutton。 当我将UIView 添加到UIImageView 时,UIView 的内容不在UIView 的框架内。因此,我无法应用平移手势识别器。 我尝试应用约束并更改 ImageView2 的框架和中心。

下面是我用来创建上述UIView 的代码。如何确保UIView 的内容在UIView 的框架中可见?

let rect = CGRect(x: self.imageView.center.x-30, y: self.imageView.center.y-30, width: 80, height: 80)

testview = UIView(frame: rect)
testview.layer.cornerRadius = testview.frame.width/2
testview.backgroundColor = UIColor.blackColor()
testview.clipsToBounds = true

imageView2 = UIImageView(frame: CGRect(x: testview.frame.minX+10, y: testview.frame.minY+10, width: 60, height: 60))

let rect2 = CGRect(x: self.testview.frame.maxX-17, y: self.testview.frame.minY, width: 20, height: 20)

removeButton = UIButton(frame: rect2)

removeButton.layer.cornerRadius = removeButton.frame.width/2

removeButton.backgroundColor = UIColor.blackColor()

removeButton.clipsToBounds = true

imageView2.layer.cornerRadius = imageView2.frame.width/2

imageView2.userInteractionEnabled = true

imageView2.clipsToBounds = true
testview.alpha = 0.3

imageView2.center = testview.center

imageView2.center = testview.center

testview.addSubview(imageView2)

testview.addSubview(removeButton)

testview.bringSubviewToFront(imageView2)

imageView.addSubview(testview)

【问题讨论】:

"UIView 的内容不在 UIView 的框架内" 不明白是什么意思。能否请您解释一下出了什么问题,更清楚一点? uiview 的子视图(imageView)在 uiview 的框架/边界之外。例如,如果 ui 视图的框架为 x:0,y:0,width : 80 ,height: 80 那么 imageview 位于 x:200,y:200:width :60 height: 60 你了解frame和bounds的区别吗? 感谢马特为我指明了正确的方向:)。你能帮忙做一件事吗,即我有选择 hidesBottomBarWhen Pushed(in storyboard) 这会从视图中删除标签栏,但是当视图出现时它会通过动画来做到这一点。我不想要那个动画,有没有办法在 viewDidLoad 方法中做到这一点。 【参考方案1】:

问题是这样的行并不像你想的那样:

let rect = CGRect(x: self.imageView.center.x-30, y: self.imageView.center.y-30, width: 80, height: 80)
// ... and ...
imageView2.center = testview.center

视图的center 位于其frame 坐标中 - 它与视图在其父视图中的放置方式有关。但是子视图的位置必须根据它的父视图bounds 来描述,而不是它的frame。它的bounds 是它的内部坐标,这就是你想要的。

让我们以最简单的情况为例:如何在父视图中居中子视图。这不是办法:

imageView2.center = testview.center

你看到问题了吗? testview.centertestview 在其父视图中的位置;它不是testviewinternal 中心,这正是你想要的。 testview的内部中心来自它的bounds。方法是这样的:

let c = CGPointMake(testview.bounds.midX, testview.bounds.midY)
imageView2.center = c

【讨论】:

以上是关于如何在确保 UIView 的内容在其框架内的同时将 UIview 添加到 imageView?的主要内容,如果未能解决你的问题,请参考以下文章

如何将子层与 UIView 一起移动?

UIView 在其图层动画后显示不正确

UIView 在其 Superview 内移动

在 UIScrollView 内的 UIView 上绘制草图

导航视图内的 UIView 更改

如何使用 Facebook PoP ios 框架水平翻转 UIView?