我要做的是“导航”到更大的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正确移动,但当我的按钮出现在屏幕的这一部分时,它不会得到任何用户交互。如果我在屏幕的第一部分移动该按钮,它可以正常工作。它与屏幕边界有关?有可能解决它?
提前致谢!
答案 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 documentation和CGAffineTransform documentation了解详情。
答案 2 :(得分:0)
2件事。
首先,为什么在仅移动对象时会使用变换。您可以轻松设置框架。
CGRect frame = introScreen.frame;
frame.origin.x -= 320;
introScreen.frame = frame;
(是的,这将在动画中起作用)
第二,如果您翻译一个视图,其内容应该在其范围内,而不管您想要首先显示的大小。
因此,您的容器视图(带有按钮的视图)应该是一个大小,以便所有包含的部分都在其边界内。超出界限的任何东西都不会起作用。使主视图的大小增加两倍并不像将包含的视图大小的两倍那样有用。
这样想。
你的桌子应该可以容纳你所看到的任何东西。如果您想要显示地图,则可以在桌面上滑动它。表格不需要像地图一样大,但地图需要足够大才能呈现其所有内容。如果说地图太短而无法显示极点,那么你就没有信息。无论你如何改变地图,你都无法使用北极或南极......
为了确保应用程序能够反映这一点,您可以在所有相关视图上启用剪辑子视图,然后如果它超出界限则不会显示。