【问题标题】:UIButton not clickable outside initial frame of an UIScrollViewUIButton 在 UIScrollView 的初始框架之外不可点击
【发布时间】:2014-01-03 15:33:39
【问题描述】:

我被 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 属性,但似乎根本不适用于我的情况。

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

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

【问题讨论】:

  • 如何设置button.frame = CGRectMake(button.frame.origin.x,scrollView.contentSize.height - button.frame.size.height,button.frame.size.width,button.frame.size.height) 并查看按钮是否位于scrollView 的末尾。
  • 按钮出现在scrollView的末尾,但仍然不可点击。好像初始帧下面的区域是不能点击的……
  • 嗨 user3088152,你找到解决办法了吗?

标签: ios iphone objective-c uiscrollview uibutton


【解决方案1】:

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

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

【讨论】:

  • 没错!我刚刚更新了滚动视图的 contentSize,但我的 UIView 的框架仍然是初始框架。如果我也更新 UIView 的框架,它就可以工作!非常感谢! :)
  • 我面临同样的问题。我有两个单独的 XIB 要加载,并且在滚动视图中添加了来自 xib 的视图。触摸/单击事件不适用于最后添加且不在可见区域中的最后一个视图。添加到滚动视图后如何更新视图框架?
  • @yurish 非常感谢您的出色回答。哈哈.. 我的意思是,我们如何准确地根据滚动视图的可见/不可见来决定哪个视图需要更改帧。可以说我有两个来自单独的 XIB 的视图。最初,第二个视图的 y 位置由第一个视图的 Y + 第一个视图的高度决定。第二个视图最初是不可见的,但是当我向下滚动时,我可以看到视图放置正确,但没有一个按钮/链接可点击第二个视图。现在如何更新第二个视图的按钮/链接框架?
  • 很难说没有看到你的代码。如何将 XIB 中的视图添加到滚动视图?您是否有一个父视图是滚动视图的子视图,并且您将 XIB 视图添加到该父视图?如果是 - 您需要更新父视图的框架,使其包含第二个视图。如果您将两个 XIB 的视图分别添加为滚动视图的子视图并且 contentSize 设置正确,那么问题可能出在其他地方。
【解决方案2】:

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

我已尝试为您生成场景。我已尝试在基于视图的应用程序上使用没有自动布局的情节提要。

所以在故事板中做这样的事情:

#import <UIKit/UIKit.h>

@interface ALViewController : UIViewController

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

@property (nonatomic, weak) IBOutlet UIButton *btn1; @property (nonatomic, weak) IBOutlet UIButton *btn2;

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

#import "ALViewController.h" 

@interface ALViewController ()

@结束

@implementation ALViewController

- (void)viewDidLoad 

{ [超级视图DidLoad]; // 在加载视图后做任何额外的设置,通常是从一个笔尖。 [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; 如果(btn.tag ==1) { [self.btn2 setHidden:FALSE]; [自我调整内容大小]; }

}

@结束

在故事板中是这样的:

@结束

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

运行您的代码: 起初,您的滚动视图将无法滚动,因为我们已将 btw 2 设置为隐藏并设置了内容大小。一旦您单击 btn 1,请查看代码,我们再次使 btn 2 可见并调用设置内容大小。

结论:

滚动视图内容大小会寻找我们可以利用的可见包含。

感谢和问候。

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2017-08-07
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多