UIView范围之外的用户交互

时间:2013-01-04 17:54:40

标签: iphone objective-c ios uiview screen

我要做的是“导航”到更大的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正确移动,但当我的按钮出现在屏幕的这一部分时,它不会得到任何用户交互。如果我在屏幕的第一部分移动该按钮,它可以正常工作。它与屏幕边界有关?有可能解决它?

提前致谢!

3 个答案:

答案 0 :(得分:6)

您应该尝试对UIView进行子类化并覆盖其pointInside:withEvent:方法,以便将其边界外的点识别为属于该视图。否则,视频边界之外的用户交互不可能按照您的意愿处理。

这就是Event Handling Guide所说的:

  

在命中测试中,窗口在视图层次结构的最顶层视图上调用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,它应该可以正常工作。

答案 1 :(得分:0)

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

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

希望这会有所帮助,并查看Apple's UIView documentationCGAffineTransform documentation了解详情。

答案 2 :(得分:0)

2件事。

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

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

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

第二,如果您翻译一个视图,其内容应该在其范围内,而不管您想要首先显示的大小。

因此,您的容器视图(带有按钮的视图)应该是一个大小,以便所有包含的部分都在其边界内。超出界限的任何东西都不会起作用。使主视图的大小增加两倍并不像将包含的视图大小的两倍那样有用。

这样想。

你的桌子应该可以容纳你所看到的任何东西。如果您想要显示地图,则可以在桌面上滑动它。表格不需要像地图一样大,但地图需要足够大才能呈现其所有内容。如果说地图太短而无法显示极点,那么你就没有信息。无论你如何改变地图,你都无法使用北极或南极......

为了确保应用程序能够反映这一点,您可以在所有相关视图上启用剪辑子视图,然后如果它超出界限则不会显示。