addSubView - 在 UIView 中添加一个按钮也会为其 SuperView 添加相同的按钮
Posted
技术标签:
【中文标题】addSubView - 在 UIView 中添加一个按钮也会为其 SuperView 添加相同的按钮【英文标题】:addSubView - adding a button inside a UIView adds the same button for it's SuperView as well 【发布时间】:2015-10-15 07:00:54 【问题描述】:我正在按照本教程创建评分按钮 - https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson5.html
我通过拖放在 Storyboard 内的 UIViewController 中创建了一个 UIView,该 UIView 由以下类控制。
class RatingControl: UIView
required init(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
button.backgroundColor = UIColor.redColor()
button.addTarget(self, action: "ratingButtonTapped:", forControlEvents: .TouchDown)
addSubview(button)
override func intrinsicContentSize() -> CGSize
return CGSize(width: 320, height: 44)
func ratingButtonTapped(button: UIButton)
print("Button pressed ????")
问题是当我添加 UIButton 时,它显示了两个按钮,一个在其父 UIViewController 的位置 (x:0, y:0) 中,另外一个在 UIView 内。我希望该按钮仅在 UIViewController 内的 UIView 内显示。
我研究了防止它的方法,一种方法是在情节提要中手动添加这些按钮,而不是在 init 中创建它们,但是我很好奇它在教程中是如何正常工作的。我使用的是 iOS 8.3。
截图:
【问题讨论】:
【参考方案1】:您必须将 UIViewControllers 视图类也子类化为 RatingControl 以及您添加的视图,因此它显示了两次。请检查它,因为如果你只将它添加到你需要的视图中,它就可以正常工作
如果您也将子类添加到 ViewControllers 视图中,您会得到这个,这取决于您的场景
【讨论】:
您介意详细说明吗,我已尽力理解您的陈述,我相信这是朝着解决此问题的正确方向迈出的一步。在 Main storyboard 的 UIViewController 中,我拖放了一个 UIView,将它的类设置为扩展 UIView 的 RatingControl 并添加了上述方法。 我已经尝试过您粘贴的代码并且它工作正常,我的意思是您必须将 ViewControllers 视图子类化为 RatingControl,在这种情况下,它会与您的子视图一起添加到超级视图中跨度> 请检查编辑后的答案,这就是您所得到的,并查看也设置为评级控制的 ViewControllers 视图,这就是您在 superView 上获得按钮的原因也是。在第一张图片中,我添加了我放在情节提要上的视图,该视图仅是 RatingControl 的子类,它可以根据您的要求工作。你能附上你的故事板图片吗 现货(附上描述中的截图)。这就是问题所在,我已经编码了一段时间,在将项目拖放到 Storyboard 时我几乎没有注意这一点。让我解决这个问题并接受答案。【参考方案2】:尝试代替
addSubview(button)
这个:
view.addSubview(button)
它将这个按钮添加到你的viewController
【讨论】:
以上是关于addSubView - 在 UIView 中添加一个按钮也会为其 SuperView 添加相同的按钮的主要内容,如果未能解决你的问题,请参考以下文章
UIView 子类的 addsubview 不能在两个方向上工作
如何在一行代码中将多个子视图添加到我的 iOS 视图中? (也许通过“monkeypatching”一个 `addSubviews` 实例方法到 UIView?)