放置在UIImage上方时,分段控件无法正常工作

时间:2014-06-14 22:40:28

标签: ios objective-c uiview uisegmentedcontrol uiview-hierarchy

我有一个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应用找到了这个。两个截图显示了问题:
Everything is OK 这里分段控制放在小UIView上方。稍微缩放后,屏幕看起来像:
UIView scrolls away, but segmented control stays at the right place
因此,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;
}

视图层次结构如下:
View hierarchy
因此,分段控件直接放在主视图上,而不是滚动视图。当垂直执行滚动时,它也会滚动,但是,当水平滚动时 - 它不会滚动。感谢您的帮助 由于Departamento B帮我解决了这个问题(这是他的想法),我用勾号标记了他的答案。

2 个答案:

答案 0 :(得分:1)

查看最终实施的解决方案的原始问题。

以下原始答案:


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

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

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

我一直在考虑这个想法,你应该做很多关于转发手势的编码,因为外面的滚动视图抓住了所有的触摸。

答案 1 :(得分:0)

怎么做

您可以通过在第一个索引处添加视图来将视图放在堆栈的底部:

[self.scrollViewinsertSubview:aView atIndex:0];

问题

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

解决方案

  1. 创建视图并将其添加到scrollView
  2. 在您刚创建的此视图上,添加您的项目(索引0处的yourImageView,以及添加segmentedView之后)
  3. 请按照以下代码
  4. 代码

    //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];