繁体   English   中英

UIView范围之外的用户交互

[英]User interaction outside the UIView bounds

我正在尝试做的是“导航”到更大的UIView,其中的按钮和控件位于不同的位置。 我已经使主UIView的大小比平时大了两倍。 它是640x480,而不是320x480。

单击屏幕第一部分中的按钮后,我在x方向上移动了-320px,以显示屏幕的第二个“隐藏”部分,其他功能将向用户显示。 除了我无法将UIView恢复到原始位置的事实之外,一切工作都很完美。 看来我用来返回原始位置的按钮不起作用,它在320px的“边界之外”。

我的UIView被称为“ introScreen”,以下是我调用的用于通过x方向平移屏幕的函数:

- (void)secondPartOfTheScreen {

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.15];
        introScreen.transform = CGAffineTransformMakeTranslation(-320, 0);
        [UIView commitAnimations];

}

调用此函数,我的UIView可以正确移动,但是当我的按钮出现在屏幕的此部分时,它不会引起任何用户交互。 如果我在屏幕的第一部分中移动该按钮,它将正常工作。 它与屏幕范围有关吗? 有可能解决吗?

提前致谢!

您应该尝试对UIView进行子类化,并重写其pointInside:withEvent:方法,以便将超出其范围的点也识别为属于视图。 否则,就不可能按照您的意愿处理视图范围之外的用户交互。

这是事件处理指南所说的:

在命中测试中,一个窗口在视图层次结构的最顶层视图上调用hitTest:withEvent:。 此方法通过在返回YES的视图层次结构中的每个视图上递归调用pointInside:withEvent:来继续进行下去,直到在找到发生触摸的子视图内找到子视图为止。 该视图将成为命中测试视图。

您可以在自定义UIView使用类似这样的内容:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView* view in self.subviews) {
      if (view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
        return YES;
      }
    }
    return NO;
}

您可以这样做:

@interface MyView: UIView
@end

@implementation MyView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView* view in self.subviews) {
      if (view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
        return YES;
      }
    }
    return NO;
}
@end

将该类定义添加到使用视图的.m文件的开头。 (您也可以使用单独的.h / .m文件,但是为了测试是否一切正常,就足够了)。 然后,在当前UIView的实例化中用MyView替换UIView ,它应该可以工作。

您没有正确使用transform属性,应考虑该属性的先前值,如下所示:

introScreen.transform = CGAffineTransformConcat(introScreen.transform, CGAffineTransformMakeTranslation(-320, 0));

希望对您有所帮助,并查看Apple的UIView文档CGAffineTransform文档以获取更多详细信息。

2件事。

首先,为什么只移动对象时要使用变换。 您可以轻松设置框架。

CGRect frame = introScreen.frame;
frame.origin.x -= 320;
introScreen.frame = frame;

(是的,这将在动画中起作用)

其次,如果您翻译视图,则其内容应在其范围之内,而不管您要首先显示的大小如何。

因此,您的容器视图(带有按钮的视图)应具有一定的大小,以便所有包含的块都在其范围之内。 任何超出其范围的内容均将不起作用。 使主视图的大小是其两倍,不如使包含视图的大小为其两倍。

这样想吧。

您的桌子应该能够容纳您所看的东西。 如果您有要显示的地图,则可以在桌子上滑动它。 表格的大小不必与地图一样大,但是地图必须足够大以向您展示其所有内容。 如果说地图太短而无法显示极点,那么您将没有信息。 无论您变换了多少地图,都将无法使用北极或南极。

为了确保应用程序能够反映这一点,您可以在所有有问题的视图上打开剪辑子视图,然后,如果它在边界之外,则将不可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM