【问题标题】:UIButton in SubView of ScrollView not workingScrollView 的子视图中的 UIButton 不起作用
【发布时间】:2014-04-29 03:10:48
【问题描述】:

我的问题是当我分页到我的子视图时我的按钮不起作用。 ScrollView 上的按钮是否一切正常。

主视图控制器

- (void)viewDidLoad
{
[super viewDidLoad];

self.sView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.sView.contentSize = CGSizeMake(self.sView.frame.size.width,
                                    self.sView.frame.size.height*2);
self.sView.pagingEnabled=YES;
self.sView.backgroundColor = [UIColor redColor];
self.sView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview:self.sView];

self.sVC = [[StartViewController alloc] initWithNibName:nil bundle:nil];
self.sVC.view.frame = CGRectMake(0, 0, self.sView.frame.size.width, self.sView.frame.size.height);

[self.sView addSubview:self.sVC.view];

[self addChildViewController:self.sVC];
}

子视图控制器

 - (void)viewDidLoad
{
[super viewDidLoad];

self.playView = [[UIView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, self.view.frame.size.height)];
self.playView.backgroundColor = [UIColor greenColor];

[self.view addSubview:self.playView];

UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(50, 50, 50, 50)];
btn.backgroundColor = [UIColor whiteColor];
[btn addTarget:self action:@selector(show:) forControlEvents:UIControlEventTouchUpInside];

[btn setUserInteractionEnabled:YES];

[self.playView addSubview:btn];
}

- (void)show:(id)sender
{
NSLog(@"--test");
}

【问题讨论】:

  • 只是想了解一下,您是否将 SubViewController 的视图作为子视图添加到 MainViewController 中? SubViewController 的类实际上是 StartViewController 吗?
  • 正确,我的 mainView 是一个滚动视图,当我向下滚动时,我看到的是带有按钮的子视图。

标签: ios iphone objective-c uiscrollview uibutton


【解决方案1】:

嗯,主要问题是您的按钮位于其视图控制器视图框架之外。

您的视图控制器显然是 (0, 0, 320, screenHeight),其中 screenHeight 是 568 或 480。这是默认行为,您可能永远不应该更改它。 只有在视图控制器的框架内发生的事件才会起作用。

您的代码的问题在于您已将播放视图框架定义为 (0, screenHeight, 320, screenHeight)。所以这个播放视图位于视图控制器的视图下方,无法捕捉到任何事件。由于您的按钮位于播放视图中,因此它也不在视图控制器中,因此无法正常工作。

您应该做的是通过设置其框架 (0,0, 320, screenHeight) 在视图控制器中设置您的播放视图,以便捕获事件。然后,您可以在将视图控制器添加到其父级时更改视图控制器的整个框架。

在子视图控制器中:

 - (void)viewDidLoad
{
    [super viewDidLoad];

    self.playView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    self.playView.backgroundColor = [UIColor greenColor];

    [self.view addSubview:self.playView];

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(50, 50, 50, 50)];
    btn.backgroundColor = [UIColor whiteColor];
    [btn addTarget:self action:@selector(show:) forControlEvents:UIControlEventTouchUpInside];

    [btn setUserInteractionEnabled:YES];

    [self.playView addSubview:btn];
}

- (void)show:(id)sender
{
    NSLog(@"--test");
}

在你的 MainView 控制器中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.sView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    self.sView.contentSize = CGSizeMake(self.sView.frame.size.width,
                                self.sView.frame.size.height*2);
    self.sView.pagingEnabled=YES;
    self.sView.backgroundColor = [UIColor redColor];
    self.sView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self.view addSubview:self.sView];

    self.sVC = [[StartViewController alloc] initWithNibName:nil bundle:nil];
    self.sVC.view.frame = CGRectMake(0, _sView.frame.size.height, _sView.frame.size.width, _sView.frame.size.height);

    [self.sView addSubview:self.sVC.view];
    [self addChildViewController:self.sVC];
}

【讨论】:

  • 嗯,这对我有用,你换框架了吗?是崩溃还是什么也没发生?
  • 您必须提供更多细节,而不仅仅是“它不工作” 什么是视图?滚动视图?不工作意味着什么都没有发生吗?
  • 这就是我在示例中所做的。我正在 MainViewController 中创建一个 ScrollView(带分页)。在一个屏幕的边距下,我将 SubViewController 添加到 ScrollView (当您垂直分页一次时)。在那个子视图中有一个按钮,我可以看到但不能点击。
  • 对不起,我不明白你到目前为止尝试了什么。你注意到框架的变化了吗?我上面写的那段代码对我来说非常好(在分页滚动视图中)。通过复制您的代码,我确实遇到了与您相同的问题,它不起作用的原因是因为 UIButton 在其视图控制器框架之外。
  • 我更改了顶部的代码。你是这个意思吗?使用此代码,我的按钮也不起作用。
【解决方案2】:

您需要启用父滚动视图的用户交互

[_sView setUserInteractionEnabled:YES];

【讨论】:

  • 在父滚动视图上交互工作正常(我测试过)。并且在 subViewController 上启用交互不会影响问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多