У меня следующая ситуация в 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 представления аннотации. Я не знаю, связано ли это с чем-то, но я чувствую, что это является источником проблемы.