如何从同一方法外部将按钮添加到 UIScrollView 作为子视图?
Posted
技术标签:
【中文标题】如何从同一方法外部将按钮添加到 UIScrollView 作为子视图?【英文标题】:How to add a button to a UIScrollView as a subView from outside the same method? 【发布时间】:2013-06-04 22:35:00 【问题描述】:所以我试图让一个简单的 UIScrollView 与一堆按钮一起工作。我使用以下代码成功地完成了这项任务:
- (void)viewDidLoad
[super viewDidLoad];
[_scroller setScrollEnabled:YES];
[_scroller setContentSize:CGSizeMake(320, 1487)];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, -500, 320, 2800)];
[imgView setBackgroundColor:[UIColor blackColor]];
[_scroller addSubview:imgView];
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn1 setTitle:@"Cool title" forState:UIControlStateNormal];
[btn1 setFrame:CGRectMake(7, 7, 150, 160)];
[btn1 setImage:[UIImage imageNamed:@"small.png"] forState:UIControlStateNormal];
[btn1 addTarget:self action:@selector(btn1_m) forControlEvents:UIControlEventTouchUpInside];
[_scroller addSubview:btn1];
但是,如果我通过界面生成器添加按钮而不是以编程方式添加它们会怎样?每当我这样做时,滚动条就不再滚动了!
例如,如果我在控制拖动按钮后使用以下代码:
- (IBAction)theButton:(UIButton *)sender
[_scroller addSubview:sender];
- (void)viewDidLoad
[super viewDidLoad];
[_scroller setScrollEnabled:YES];
[_scroller setContentSize:CGSizeMake(320, 1487)];
...滚动不起作用,我看到了按钮,但不再滚动。基本上,我只想使用界面生成器向我的应用程序添加按钮并让它们滚动,但似乎无法让它工作!
【问题讨论】:
你添加方法“btn1_m”了吗? 是的,我做到了。如果以编程方式或使用 Interface Builder 完成,它会正确调用该方法,但如果通过 Interface Builder 完成,则滚动会死掉。 可能是 UIImageView 块滚动。您确定其他控件没有与滚动重叠吗? 即使不包含 UIImageView,我也会得到相同的结果。我确定原因与按钮未正确添加到子视图或其他原因有关 【参考方案1】:当您以编程方式创建 UI 时,滚动视图的子视图如下所示:
图像视图 按钮 按钮 ...
当您使用 IB 添加按钮时,您最终会得到:
按钮 按钮 ... 图像视图
在将图像视图添加到滚动视图后放置一个断点。在 LLDB 控制台中输入:
(lldb) po _scroller.subviews
我怀疑您会在列表底部看到您的图像视图。它覆盖了你的按钮,但它正在滚动,它看起来不像它,因为它是一个大的黑色图像视图。
将您的图像视图发送到子视图列表的后面:
[_scroller sendSubviewToBack:imgView];
然后您将再次看到您的按钮。 此外,完成此操作后,在 lldb 中确认您的滚动视图内容大小:
(lldb) p _scroller.contentSize
如果一切看起来都正确,它应该正在滚动。
【讨论】:
以上是关于如何从同一方法外部将按钮添加到 UIScrollView 作为子视图?的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS-如何将按钮添加到 CollectionView 单元的外部
将“另存为新”按钮添加到 Django 外部对象编辑弹出窗口