2

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

提前致谢!

4

3 回答 3

6

您应该尝试将您的子类化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 文件,但为了测试一切是否正常,这就足够了)。然后,在您的 current 的实例化中UIView替换为,它应该可以工作。MyViewUIView

于 2013-01-04T18:20:08.200 回答
0

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

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

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

于 2013-01-04T18:04:48.887 回答
0

2 件事。

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

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

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

其次,如果你翻译一个视图,它的内容应该在它的范围内,不管你想首先显示的大小。

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

像这样想。

您的桌子应该能够容纳您所看的任何东西。如果您有要显示的地图,您可以在桌子上滑动它。表格不需要和地图一样大,但地图需要足够大以向您展示其所有内容。如果地图太短而无法显示两极,那么您将没有信息。无论您如何改变地图,您都无法使用北极或南极..

To ensure the app reflects this you can turn on clip subviews on all the views in question, then if its outside the bounds it will not be visible.

于 2013-01-04T18:42:07.160 回答