UIButton超出视图控制器而没有剪切到其边界

时间:2016-12-30 12:10:47

标签: ios swift uibutton

在我的应用中,我从这里使用KYDrawerController库:https://github.com/ykyouhei/KYDrawerController

它按预期工作,但我想在菜单视图控制器上添加一个UIButton(打开时位于顶部),但它被视图边界剪切。我可以通过向您展示屏幕截图来解释这一点的最佳方式:

enter image description here

以下是它的样子:

enter image description here

按钮现在具有负右约束边距,因此它的位置是正确的,但是如何禁用剪裁呢?

在菜单视图控制器中,您可以在前台看到,我已添加此代码:

    self.navigationController?.navigationBar.clipsToBounds = false
    self.navigationController?.view.clipsToBounds = false
    self.view.clipsToBounds = false
    let elDrawer = self.navigationController?.parent as! KYDrawerController
    elDrawer.view.clipsToBounds = false
    elDrawer.displayingViewController?.view.clipsToBounds = false
    elDrawer.drawerViewController?.view.clipsToBounds = false
    elDrawer.displayingViewController?.view.clipsToBounds = false
    elDrawer.mainViewController.view.clipsToBounds = false
    elDrawer.inputViewController?.view.clipsToBounds = false
    elDrawer.splitViewController?.view.clipsToBounds = false

正如您所看到的,我已经尝试了所有可能的方法来禁用剪辑,但它仍然被裁剪。我怎样才能做到这一点?

编辑: 添加了层次视图: enter image description here

我也尝试过以下测试:

var view = arrowButton as UIView?
        repeat {
            view = view?.superview
            if let sview = view {
                if(sview.clipsToBounds){
                    print("View \(view) clips to bounds")
                    break
                }
                else{
                    print("View \(view) does not clip to bounds")
                }
            }
        } while (view != nil)

它打印出来:

  

查看可选(>)不会剪辑到   边界

所以看起来没什么东西可以裁剪但它已经剪裁了。

EDIT2: debug视图层次结构: enter image description here

2 个答案:

答案 0 :(得分:1)

是的,我找到了解决方案:

self.navigationController?.view.subviews[0].clipsToBounds = false

不需要旧代码。

UINavigationTransitionView(它的Apple私人课程)是负责打开clipToBounds的人。

答案 1 :(得分:0)

我们无法确切地告诉您发生了什么,因为您没有向我们展示视图层次结构。

我建议你编写从按钮开始的测试代码,沿着superview层次结构寻找一个'clipsToBounds为true的超级视图。像这样:

var view = button as UIView?
repeat {
  view = view.superview
  if view?.superview.clipsToBounds ?? false == true {
    print("View \(view) clips to bounds")
    break
} while view != nil

然后你会知道哪个视图是裁剪的,你可以用你正在使用的“霰弹枪”方法修复它。

编辑:

我不确定你为什么会收到如此奇怪的调试信息。我建议在所有按钮的超级视图中添加唯一标记号,然后使用以下代码:

override func viewDidAppear(_ animated: Bool) {
  var view = button as UIView?
  repeat {
    view = view?.superview
    if let view = view {
      let tag = view.tag
      let description = (tag == 0) ? view.debugDescription : "view w tag \(tag)"
      if(view.clipsToBounds){
        print("View \(description) clips to bounds")
        break
      }
      else{
        print("View \(description) does not clip to bounds")
      }
    }
  } while (view != nil)

}

发布 ALL 该调试代码的输出,以便我们可以看到您正在处理的整个视图层次结构。