[英]MKMapView not responding to touch events or gesture recognizers
编辑 :
发布此问题后,我立即发现错过注释的一行代码。 就是这个... mapViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
我将其注释掉,地图再次正常工作。
您是否知道为什么该行代码会杀死地图手势识别器?
我有一个MKMapView,最近几个月运行良好,今天就死了。
我今天做的唯一的事情就是弄乱了代码,就是在viewWillTransitionToSize:withTransitionCoordinator:
和viewWillLayoutSubviews
使用一些定向代码! 我注释掉了我在那里所做的一切,但仍然死了。
它不仅不会响应我自己的手势识别器,也不会响应自己的任何识别器……捏,旋转等。它只是冻结了。
我在地图上方没有任何会阻碍触摸的视图。
我已经控制清理了我的构建文件夹。
我已经关闭了XCode项目,并删除了该项目的派生数据文件夹。
@implementation MapViewController
{
MKMapView *appleMapView;
}
-(void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self addMapViewToSelf];
}
-(void)addMapViewToSelf
{
// Create and add the apple map view to the side menu view.
appleMapView = [[MKMapView alloc] initWithFrame:self.view.frame];
[self.view addSubview:appleMapView];
appleMapView.delegate = self;
UILongPressGestureRecognizer *tapRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(windowTapped:)];
tapRecognizer.minimumPressDuration = 1.0f;
tapRecognizer.delegate = self;
[appleMapView addGestureRecognizer:tapRecognizer];
}
-(void)windowTapped:(UIGestureRecognizer *)recognizer
{
NSLog(@"The recognizer state is '%ld'", (long)recognizer.state);
if (recognizer.state != UIGestureRecognizerStateBegan) {
return;
}
}
当边界改变时,AutoResizingMask是通过UI元素(例如Label)移动的属性。 意味着当方向改变时,应用程序会适应并且不会崩溃。 但是,如果将autoResizingMask设置为Constraint,则告诉它根据autoResizingMask更改约束。 这是每个UI元素的默认行为。 这有助于我们使用诸如self.view.centre或self.view.frame或self.label.size.width等方法快速动态地排列UI元素。
设置translatesAutoresizingMaskIntoConstraints = NO,您实际上正在删除此行为。 因此,您必须提供UI元素固定的坐标,以便无论屏幕的方向如何,UI元素都将停留在该位置。 但是您没有这样做。 因此,UIElement没有约束或固定位置,并且行为正常。
如果您不想随UI的位置或大小动态播放,则不得将其设置为NO。 像基于输入的不断增长的文本字段或一些粗略的动画。
这是苹果试图告诉你的一件事。
当视图的边界发生变化时,该视图会根据每个子视图的自动调整蒙版自动调整其子视图的大小。 您可以通过使用C逐位OR运算符组合UIViewAutoresizing中描述的常量来指定此掩码的值。 结合使用这些常量,您可以指定视图的哪些尺寸应相对于父视图增大或缩小。 此属性的默认值为UIViewAutoresizingNone,它指示不应完全调整视图的大小。
当设置了沿同一轴的多个选项时,默认行为是在柔性部分之间按比例分配大小差异。 相对于其他柔性部分,柔性部分越大,它越可能增长。 例如,假设此属性包含UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleRightMargin常量,但不包含UIViewAutoresizingFlexibleLeftMargin常量,因此表示该视图的左边缘宽度是固定的,但是该视图的宽度和右边缘可能会改变。 因此,视图看起来锚定在其视图的左侧,而视图宽度和视图右侧的间隙都增加了。
如果自动调整大小行为不能提供所需的精确视图布局,则可以使用自定义容器视图并覆盖其layoutSubviews方法以更精确地定位子视图。
我犯了百万次这样的错误,此博客对此有一个很好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.