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

时间:2013-12-16 09:42:53

标签: ios iphone objective-c uiscrollview uibutton

我对UIScrollView的奇怪行为感到困惑,在放大UIScrollView的contentSize之后,我无法点击UIButton。

我想做什么:

  1. 使用UIScrollView显示表单

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

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

  4. 问题是我将新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];

    enter image description here

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

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

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

2 个答案:

答案 0 :(得分:-2)

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

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

答案 1 :(得分:-2)

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

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

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

#import <UIKit/UIKit.h>

@interface ALViewController:UIViewController

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

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

=========== 实现:

#import "ALViewController.h" 

@interface ALViewController()

@end

@implementation ALViewController

- (void)viewDidLoad 

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

[self adjustContentSize];

}

- (无效)adjustContentSize {     CGRect contentRect = CGRectZero;     for(UIView *在self.scroll.subviews中查看)     {         if(![view isHidden]){             contentRect = CGRectUnion(contentRect,view.frame);         }     }

self.scroll.contentSize = contentRect.size;

}

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

- (IBAction为)btnClicked:(ID)发送方 {     UIButton * btn =(UIButton *)发件人;     if(btn.tag == 1)     {         [self.btn2 setHidden:FALSE];         [self adjustContentSize];     }

}

@end

并在故事板中有这样的事情:

enter image description here @end

供您参考:查看第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 size。

结论:

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

感谢和问候。