MKMapView无法响应触摸事件或手势识别器

时间:2016-06-02 18:01:30

标签: ios objective-c

修改

在发布此问题后,我立即找到了一行我错过评论的代码。就是这个...... mapViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

我对此进行了评论,地图又重新开始了。

你知道为什么那行代码会杀死地​​图手势识别器吗?

我有一个MKMapView,最近几个月工作得很好,今天就退出了。

我今天做的唯一一件事,就是弄乱代码,就是在viewWillTransitionToSize:withTransitionCoordinator:viewWillLayoutSubviews中使用一些方向代码。这就是IT !!! 我评论了我在那里所做的一切,但它已经死了。

它不仅不会响应我自己的手势识别器,它也不会响应任何自己的识别器......捏,旋转等等。它只是冻结了。

我在地图上没有任何阻碍触摸的视图。

我有控制清理(编辑)我的构建文件夹。

我关闭了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;
    }

}

1 个答案:

答案 0 :(得分:1)

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。像基于输入的增长文本字段或一些原始动画。

这是Apple试图告诉你同样的事情。

  

当视图的边界发生变化时,该视图会自动调整其大小   根据每个子视图的自动调整掩码进行子视图。你指定   通过组合中描述的常量来组合掩码的值   UIView使用C按位OR运算符进行自动调整。结合这些   常量允许您指定视图的哪些维度应该增长或   相对于superview缩小。此属性的默认值   是UIViewAutoresizingNone,表示视图不应该是   根本没有调整大小。

     

如果设置了同一轴上的多个选项,则为默认值   行为是按比例分配大小差异   灵活的部分。柔性部分相对于柔性部分越大   其他柔性部分,它可能越多。例如,   假设此属性包含UIViewAutoresizingFlexibleWidth和   UIViewAutoresizingFlexibleRightMargin常量但不包括   UIViewAutoresizingFlexibleLeftMargin常量,从而表明   视图左边距的宽度是固定的,但视图的宽度是固定的   宽度和右边距可能会改变。因此,视图似乎锚定于   其超视图的左侧同时具有视图宽度和间隙   在视图右侧增加。

     

如果自动调整行为不能提供您的精确布局   需要您的视图,您可以使用自定义容器视图和覆盖   它的layoutSubviews方法可以更精确地定位您的子视图。

我犯了一百万次这样的错误,这个博客有一个很好的解决方案。

https://www.innoq.com/en/blog/ios-auto-layout-problem/