UIButton无法在UIScrollView的初始帧外部单击

我遇到了UIScrollView的奇怪行为,在放大UIScrollView的contentSize之后我无法点击UIButton。

我想做什么:

  1. 使用UIScrollView显示表单

  2. 单击提交按钮后,滚动视图将放大一些高度以显示更多信息。

  3. 在进一步的信息中,我将放置并显示另一个UIButton(隐藏在开头),以便处理下一步。

问题是我将新UIButton放置到放大区域并且按钮不可点击,而我将UIButton放置到现有区域(滚动视图的初始帧),然后按钮正常工作。 对于这两种情况,滚动视图的滚动条执行正常行为。(即,滚动结束是新的内容高度)

这是我到目前为止:

  • 一个UIView xib(放置其中的所有元素,包括隐藏按钮)

  • UIScrollView(将UIView xib加载到其中)

UIView* view = [[[NSBundle mainBundle] loadNibNamed:@"view" owner:self options:nil] objectAtIndex:0];

[view loaded];

[scrollView addSubview:view];

  • 单击提交按钮后:

// offset = some amount;

[scrollview setContentSize:CGSizeMake(scrollview.contentSize.width, scrollview.contentSize.height+offset)];

// h = some amount before the end of the scroll view

CGRect r = nextBtn.frame;

r.origin.y = h;

nextBtn.frame = r;

[nextBtn setHidden:NO];

在此处输入图像描述

我试图更改滚动视图的clipSubviews属性,但似乎它根本不适用于我的情况。

谁知道它是怎么发生的? 有没有更好的方法来完成这项工作? (调整滚动视图的大小,然后在其中放置另一个按钮)

任何帮助都会很棒! 非常感谢!

我假设该按钮是您从xib文件加载的内容视图的直接或间接子项。

问题是因为您更改了滚动视图的contentSize但未更改内容视图的框架。 超级视图参与触摸测试。 您可以将子视图放在其超视图范围之外,默认情况下,子视图不会被剪裁,但触摸事件将不会传递给它,因为超级视图在命中测试期间检查触摸是否在其边界之外并拒绝触摸。 有关详细信息,请参阅UIView hitTest:withEvent:

你可以添加一个按钮说提交和另一个按钮作为scrollview的子视图。保持你在启动时隐藏的另一个按钮并调用setContentsize。 现在当用户点击提交按钮然后将另一个按钮设置为可见并再次调用设置内容大小。这样您就可以实现您想要的效果。

我试图为你生成场景。我已经在基于视图的应用程序上尝试了这个,没有自动布局的故事板。

所以在故事板上做一些这样的事情:

 #import  

@interface ALViewController:UIViewController

 @property (nonatomic, weak) IBOutlet UIScrollView *scroll; 

@property(非primefaces,弱)IBOutlet UIButton * btn1; @property(非primefaces,弱)IBOutlet UIButton * btn2;

===========实施:

 #import "ALViewController.h" 

@interface ALViewController()

@结束

@implementation ALViewController

 - (void)viewDidLoad 

{[super viewDidLoad]; //在加载视图后进行任何其他设置,通常是从笔尖。 [self.btn2 setHidden:YES];

 [self adjustContentSize]; 

}

– (void)adjustContentSize {CGRect contentRect = CGRectZero; for(UIView * view in self.scroll.subviews){if(![view isHidden]){contentRect = CGRectUnion(contentRect,view.frame); }}

 self.scroll.contentSize = contentRect.size; 

}

  • (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning]; //处理可以重新创建的任何资源。 }

– (IBAction)btnClicked:(id)sender {UIButton * btn =(UIButton *)sender; if(btn.tag == 1){[self.btn2 setHidden:FALSE]; [self adjustContentSize]; }

 } 

@结束

在故事板中有一些这样的事情:

在此处输入图像描述 @结束

供您参考:查看框架0,0,768,1024滚动框架:0,0,768,1024 btn1框架:361,753,46,30 btn2框架:351,1032,46,30

运行你的代码:首先你的滚动视图是不可滚动的,因为我们已经设置btw 2被隐藏并设置内容大小。只要你点击btn 1,看到我们正在制作的代码btn 2再次可见并调用set content尺寸。

结论:

scrollview内容大小查找其可见的包含,我们可以从中受益。

感谢致敬。