Monotouch Пользовательское подпредставление выноски в пользовательском представлении аннотации, кажется, не взаимодействует - PullRequest
0 голосов
/ 10 января 2012

У меня следующая ситуация в Monotouch. Я реализовал блестящее решение, которое показано в следующем посте Как настроить пузырь выноски для MKAnnotationView? от TappCandy. Мой пользовательский вид выноски - это подкласс MKPinAnnotationView.

Пока что решение работает хорошо в отношении показа выноски. Но у меня есть проблема с пользовательским взаимодействием подпункта выноски. Он состоит из трех меток и кнопки, каждая под другой. Для кнопки определено событие TouchUpInside, но кажется, что в кнопке не включено взаимодействие с пользователем. Единственная распознаваемая область касания кнопки - небольшая область над изображением булавки. Если смещение подпредставления относительно изображения булавки превышает пороговое значение, похоже, что для кнопки нет сенсорной области.

Итак, мой вопрос таков: как я могу нормально взаимодействовать с пользователем для кнопки и всего подпредставления соответственно? Код, который я использую для добавления подпредставления выноски при выполнении SetSelected пользовательского класса представления аннотации, выглядит следующим образом:

public override void SetSelected(bool selected, bool animated)
{
    base.SetSelected(selected, animated);

    if(selected)
    {
        ShowCallout(); // this.AddSubview(calloutView);
    }
    else
    {
        FadeOutCallout(); // calloutView.RemoveFromSuperview();
    }
}

где ShowCallout () и FadeCallout () добавляют и удаляют пользовательское подпредставление выноски (с тремя метками и кнопкой) с помощью эффекта постепенного появления / исчезновения.

Код, который создает настраиваемое подпредставление выноски при создании настраиваемого представления аннотации и помещает его в определенное смещение над выводом, является следующим:

private void CreateCalloutView()
{
   calloutView = new UIView();
   calloutView.AutoresizingMask = UIViewAutoresizing.All;
   calloutViewFrame = new RectangleF(calloutViewFrame.X + offsetFromParent.X,
                                     calloutViewFrame.Y + offsetFromParent.Y,
                                     calloutViewFrame.Size.Width,
                                     calloutViewFrame.Size.Height);
   calloutView.Frame = calloutViewFrame;
   calloutView.BackgroundColor = UIColor.Clear;

   // Create the callout label views.
   text1 = new UILabel();
   text1.AutoresizingMask = UIViewAutoresizing.All;
   text1.TextAlignment = UITextAlignment.Center;
   text1.Frame = new RectangleF(0, 0, calloutView.Frame.Size.Width, 21);
   text1.Text = "text1";
   text1.BackgroundColor = UIColor.Clear;
   text.Font = UIFont.SystemFontOfSize(17);

   text2 = new UILabel();
   text2.AutoresizingMask = UIViewAutoresizing.All;
   text2.TextAlignment = UITextAlignment.Center;
   text2.Frame = new RectangleF(0, text1.Frame.Y +
                                   text1.Frame.Size.Height,
                                   calloutView.Frame.Size.Width, 21);
   text2.Text = "text2";
   text2.BackgroundColor = UIColor.Clear;
   text2.Font = UIFont.SystemFontOfSize(17);

   text3 = new UILabel();
   text3.AutoresizingMask = UIViewAutoresizing.All;
   text3.TextAlignment = UITextAlignment.Center;
   text3.Frame = new RectangleF(0, text1.Frame.Y +
                                   text1.Frame.Size.Height +
                                   text2.Frame.Size.Height,
                                   calloutView.Frame.Size.Width, 21);
   text3.Text = "text3";
   text3.BackgroundColor = UIColor.Clear;
   text3.Font = UIFont.SystemFontOfSize(17);

   button = UIButton.FromType(UIButtonType.RoundedRect);
   button.UserInteractionEnabled = true;
   button.AutoresizingMask = UIViewAutoresizing.All;
   button.Frame = new RectangleF(20, text1.Frame.Y +
                                     text1.Frame.Size.Height +
                                     text2.Frame.Size.Height +
                                     text3.Frame.Size.Height, 156, 37);

   button.Font = UIFont.SystemFontOfSize(15);
   button.SetTitleColor(UIColor.Black, UIControlState.Normal);
   button.SetTitle("Button >", UIControlState.Normal);
   button.TouchUpInside += (sender, e) => {

       Console.WriteLine("Button is touched");
   };

   calloutView.AddSubview(text1);
   calloutView.AddSubview(text2);
   calloutView.AddSubview(text3);
   calloutView.AddSubview(button);

}

Оказывается, вид выноски отображается почти хорошо, но я не могу прикоснуться к кнопке.

ОБНОВЛЕНИЕ: я заметил, что кнопка активна только тогда, когда она перекрывается с изображением булавки внизу. Если я настраиваю смещение подпредставления так, чтобы кнопка находилась точно над изображением булавки, это определенно можно щелкнуть.

Я также заметил, что есть исключение MonoTouch.Foundation.MonoTouchException в свойстве EnableInputClicksWhenVisible представления аннотации. Я не знаю, связано ли это с чем-то, но я чувствую, что это является источником проблемы.

...