And*_*ria 2 iphone screen objective-c uiview ios
我正在尝试做的是"导航"到一个更大的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];
}
Run Code Online (Sandbox Code Playgroud)
调用此函数我的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;
}
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
@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
Run Code Online (Sandbox Code Playgroud)
将此类定义添加到.m使用视图的文件的开头.(您也可以使用单独的.h/.m文件,但为了测试是否一切正常,这就足够了).然后,替换UIView用MyView在当前的实例UIView,它应该工作.