放置在 UIImage 上方时,分段控件不起作用

Posted

技术标签:

【中文标题】放置在 UIImage 上方时,分段控件不起作用【英文标题】:Segmented control not working when placed above UIImage 【发布时间】:2014-06-14 22:40:28 【问题描述】:

我有一个 ScrollView,其中包含一个 imageView(使用 addSubView 以编程方式创建)和一个视图,其中包含用于更改图片的分段控件。我添加了用于缩放的手势识别器。分段控件的水平位置是固定的。当我尝试单击分段控件并且图像放大太多时会出现问题。它不起作用。如果缩放级别很小,它会继续工作并在图像之间切换。 下面的两个屏幕截图说明了这种情况:1)分段控制工作时和 2)它不工作时。

http://cs617220.vk.me/v617220757/e375/hvRdXNe9SBY.jpg http://cs617220.vk.me/v617220757/e36e/E4auq4-kFL4.jpg

我认为,问题出在视图的层次结构中,当添加的子视图不与分段控制的视图重叠时 - 它可以工作,而当重叠时 - 它会停止。我试图将imageView放在底部,这里是代码:

[self.scrollView addSubview:self.imageView];
[self.scrollView sendSubviewToBack:self.imageView];

但这无济于事,问题仍然存在。如何将 imageView 放在堆栈的底部?

更新评论: 我在 UIScrollView 和分段控件之间有一个小的 UIView。看来,我设法抓住了问题:它是水平固定代码。我使用 Reveal 应用程序来发现这一点。两张截图显示问题: 这里分段控件被放置在小 UIView 的正上方。稍微放大后屏幕看起来像: 因此,UIView 作为图片的其余部分消失了,并且没有固定的水平位置。有趣的是,如果我将分段控件直接放在 UIScrollView 上,它可以工作,但位置不是水平固定的。这是代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    CGRect frame = _floorSelector.frame;
    frame.origin.x = scrollView.contentOffset.x;
    _floorSelector.frame = frame;

这不起作用(如果我尝试修复 UIView 的位置,而不是分段控制):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView


    CGRect frame = _selectorView.frame;
    frame.origin.x = scrollView.contentOffset.x;
    _selectorView.frame = frame;

解决方案: 我决定摆脱所有补充视图并为分段视图实现垂直滚动,而不是阻止向一个方向滚动。代码在这里:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    CGRect frame = _floorSelector.frame;
    frame.origin.y = -scrollView.contentOffset.y;
    _floorSelector.frame = frame;

以及视图层次结构如下: 因此,分段控件直接放置在主视图上,而不是滚动视图上。垂直滚动时,它也会滚动,但水平滚动时,它不会滚动。感谢您的帮助。 由于 Departamento B 帮助我解决了这个问题(这是他的主意),我在他的答案上打了勾。

【问题讨论】:

您是否将分段控件添加到UIScrollView 我更新了帖子。问题仍然与 UIView 层次结构有关,但与我想的完全不同。附上截图。 屏幕截图可以直接添加到您的帖子中:) 我没有足够的声望直接添加它们。很抱歉给您带来不便。 请问你是怎么截屏的? 【参考方案1】:

有关最终实施的解决方案,请参阅原始问题。

原答案如下:


分别控制垂直和水平控制:

根视图 Scrollview -- 适合宽度,垂直滚动,高度通过捏合更新大小 分段控制 Scrollview -- 适合父滚动视图的高度,宽度由捏更新 图片 -- 宽度和高度由捏更新

关注点:对角滚动效果如何?我建议在重建整个屏幕之前在一个简单的静态故事板屏幕中尝试一下。

我一直在玩弄这个想法,当外部滚动视图抓取所有触摸时,您应该围绕转发手势进行大量编码。

【讨论】:

好主意,但有一点阻止我使用这种方法:分段控件应该浮动并且能够垂直滚动,以便内容可以使用屏幕空间。据我了解,这种设计有一些更新的方法,所以我想请你分享一下。我使用了 WWDC 2011 的想法“高级滚动技术”。 好的,所以你希望它像图像一样垂直滚动,但水平滚动它应该保持居中?我已经用一个想法更新了我的答案。【参考方案2】:

怎么做

您可以通过将视图添加到第一个索引来将视图置于堆栈底部:

[self.scrollViewinsertSubview:aView atIndex:0];

问题

但是当您在 scrollView 中有多个子视图时,滚动会出现一些问题。那么你应该怎么做:

解决方案

    创建一个视图并将其添加到滚动视图中 在您刚刚创建的这个视图上,添加您的项目(yourImageView 在索引 0 处,然后添加您的分段视图) 按照下面的代码进行操作

代码

//adding your view, as a subview of scrollView
[self.scrollView addSubview:self.yourView atIndex:0];

//On your view insert at index 0 your self.imageView
[self.yourView sendSubviewToBack:self.imageView atIndex:0];

//Now add your segmentedView
[self.yourView sendSubviewToBack:self.segmentedView];

【讨论】:

以上是关于放置在 UIImage 上方时,分段控件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UpdateData() 在 MFC CEdit 控件的 EN_CHANGE 处理程序中不起作用

VBPieChart - removeFromSuperView 不起作用(隐藏图表)

如何在 Swift 的工具栏顶部居中分段控件?

Swift 自定义分段控件 SegmentedControl

边界细化后的分段评估不起作用

顶部的 Video.js 控件和暂停不起作用