UIScrollview 内容总是在顶部

Posted

技术标签:

【中文标题】UIScrollview 内容总是在顶部【英文标题】:UIScrollview contents always on top 【发布时间】:2011-10-07 21:03:33 【问题描述】:

我正在尝试让我的UIScrollView 占据整个屏幕并在其中包含用户可以缩放、平移等的图像。这一切都有效。但是,当用户点击屏幕一次时,我希望在此UIScrollView 之上出现一个附加视图,其中包含有关图片的一些信息。问题是无论我做什么,UIScrollView 的子 ImageView 总是在最前面。我尝试更改 xib 中视图的顺序,我尝试使用 bringSubViewToFront 没有成功。这是代码:

- (void)viewDidLoad        
    [super viewDidLoad];
    UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(flipViewSingleTap:)];  
    singleTapGesture.delegate = self;    

    self.flippedImage.userInteractionEnabled = YES;
    [self.flippedImage addGestureRecognizer:singleTapGesture];

    [singleTapGesture release];

    self.flippedImageView.contentSize = CGSizeMake(1024, 768);
    self.flippedImageView.delegate = self;

    self.flippedMenuView.alpha = 0.0f;


- (IBAction)flipViewSingleTap:(UIGestureRecognizer *)sender 
    flipItemsVisible = !flipItemsVisible;
    [self.view bringSubviewToFront:self.flippedMenuView];
    [UIView animateWithDuration:0.5f 
                          delay:0.0f 
                        options:UIViewAnimationCurveEaseInOut
                     animations:^
                         self.flippedMenuView.alpha = flipItemsVisible ? 1.0f : 0.0f
               
                     completion:nil];

【问题讨论】:

【参考方案1】:

也许将这一行添加到 viewDidLoad:

[self.view addSubview:self.flippedMenuView];

(假设 self.view 是 UIScrollView。)

【讨论】:

感谢您的建议,但这无济于事。如果我将 FlippedMenuView 添加为 UIScrollView 的子视图,如果用户放大,它会从屏幕上移开。我将其添加为顶部的单独视图的目的是使其在运动方面“静态”。跨度> 【参考方案2】:

尝试添加忽略菜单视图的gestureRecognizer:shouldReceiveTouch: 委托方法。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
       shouldReceiveTouch:(UITouch *)touch 
  return ![touch.view isDescendantOfView:self.flippedMenuView];

【讨论】:

谢谢,但没有,这并没有改变任何东西。 如果添加NSLog(@"%@", touch.view);(并尝试始终返回NO 然后YES),您会看到什么? flippedViewflippedMenuView 视图子视图在同一个视图中吗? 我认为问题与触摸无关。即使我最初使 FlippedMenuView 可见,它总是被描绘在滚动图像的后面。 我知道这是旧的并且可能已解决,但 UIScrollView 已经附加了手势识别器并“捕获”某些触摸。上述答案将帮助您缩小解决方案的范围。我看到您已经注意到您需要打开交互才能获得积分。我现在正在处理滚动视图,它们与额外的子视图等有点复杂。文档中没有的烦人的东西【参考方案3】:

为图像视图打开 userInteraction 是不够的。 touchesMoved/Began 的默认方法是空白的(我认为)。

确保您自己的 UIImageView 自定义子类是 flippedImageView 是什么。覆盖这些方法并发送一个委托消息(自定义),其中包含“userTappedImageAt:”之类的内容。

如果您的子视图处理不会将任何东西放在前面,并且您的触摸工作正常,请抓住应用程序委托窗口 [[[UIApplication sharedApplication] 委托] 窗口] 并向其添加子视图,但这样做可能更安全使用视图,以便您可以使用 convertPoint: from/to 函数。

我告诉你的大部分内容都可以通过阅读视图和编程指南以及关于 SO 的问题以及关于获得视图的答案来推断。

您始终可以“滚动自己的”子视图以避免未知的 SDK 识别器。

祝你好运, 斯蒂芬

【讨论】:

以上是关于UIScrollview 内容总是在顶部的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 总是弹回顶部

UIScrollView 无法正常工作(它返回顶部并且不显示任何滚动条

IOS UIScrollView + UIButton 实现页面和顶部标签页水平滚动效果

获取 UIWebView 加载内容的高度

将 UIScrollView 中的内容视图固定到其底部而不是其顶部边缘

防止uiscrollview向右滚动