2016-07-21 13 views
0

Ich möchte Screenshots machen, wenn ich das Gerät schüttele und möchte, dass dies funktioniert, wenn ein UIAlertView sichtbar ist. Das Problem ist, dass die MotionBegan- und MotionEnded-Methoden nicht aufgerufen werden. Ich habe versucht, UIWindow und UIAlertView zu untergliedern und die darin enthaltenen Methoden zu überschreiben, aber trotzdem wird nichts aufgerufen.Handle Shake Gestures wenn UIAlertView angezeigt wird

Fehle ich hier etwas?

aktiviere ich Gesten schütteln durch

UIApplication.SharedApplication.ApplicationSupportsShakeToEdit = true; 

in AppDelegate.cs aufrufen.

Und alles funktioniert perfekt, wenn kein UIAlertView sichtbar ist.

Welche Ansicht reagiert auf Schüttelbewegungen, wenn eine UIAlertView angezeigt wird?

Antwort

2

Ich würde sehr empfehlen, UIAlertView nicht zu verwenden.

  • Zuerst wird es in iOS9 veraltet

  • Second es ein wirklich ist messedUIView. Apple unterstützt das Unterklassifizieren nicht und die Dinge gehen wirklich seitwärts, wenn Sie versuchen, ResignFirstResponder zu empfangen, damit Sie Ereignisse empfangen können. Zusammen mit einer Reihe von anderen Dingen, die seltsam sind, kein Wunder, dass Apple es missbilligte.

Verwenden UIAlertController stattdessen es in iOS8/10.09 verfügbar ist und verhält sich wie eine richtige UIViewController und sieht aus wie die alten Warnungen, wenn mit UIAlertControllerStyle.Alert Stil verwendet, und Sie werden keine Probleme mit MotionBegan/MotionEnded haben, wenn es zu benutzen.

So Sie entweder MotionBegan/MotionEnded auf jedem UIViewController außer Kraft setzen können:

public override void MotionBegan(UIEventSubtype motion, UIEvent evt) 
{ 
    Console.WriteLine("MotionBegin"); 
    base.MotionBegan(motion, evt); 
} 

public override void MotionEnded(UIEventSubtype motion, UIEvent evt) 
{ 
    Console.WriteLine("MotionEnded"); 
    base.MotionEnded(motion, evt); 
} 

Oder erstellen Sie Ihre eigenen UIWindow Unterklasse und und somit erhalten Sie global motion events (man kann nur schreiben (PostNotificationName) über Benachrichtigungszentrale, wenn andere Bereiche Ihrer App auf Bewegungsereignisse reagieren müssen

public class ShakeWindow : UIWindow 
{ 
    public ShakeWindow() : base() { } 

    public ShakeWindow(IntPtr handle) : base(handle) { } 

    public override void MotionBegan(UIEventSubtype motion, UIEvent evt) 
    { 
     Console.WriteLine("Window MotionBegin"); 
     NSNotificationCenter.DefaultCenter.PostNotificationName("ShakeMe", this); 
     base.MotionBegan(motion, evt); 
    } 

    public override void MotionEnded(UIEventSubtype motion, UIEvent evt) 
    { 
     Console.WriteLine("Window MotionEnded"); 
     base.MotionEnded(motion, evt); 
    } 
} 

UIAlertController Beispiel mit NSNotificationCenter:

var button2 = new UIButton(UIButtonType.RoundedRect); 
button2.SetTitle("Alert 2", UIControlState.Normal); 
button2.Frame = new CGRect(20, 60, 100, 40); 
button2.TouchUpInside += (object sender, EventArgs e) => 
{ 
    var alert2 = UIAlertController.Create("StackOverflow", "Shake me now", UIAlertControllerStyle.Alert); 
    NSNotificationCenter.DefaultCenter.AddObserver(new NSString("ShakeMe"), (obj) => 
    { 
     alert2?.DismissViewController(true, null); 
    }); 
    alert2.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Default, (UIAlertAction obj) => 
    { 
     alert2.DismissViewController(true, null); 
    })); 
    PresentViewControllerAsync(alert2, true); 
}; 
Add(button2); 
+0

Großartig! Danke für die schnelle Antwort. Ich werde stattdessen einen UIAlertController verwenden. Der Grund für die Verwendung von UIAlertViews ist, dass einige der Benutzer noch über iOS 7 verfügen und daher UIAlerViewControllers nicht anzeigen können. Da diese Screenshot-Funktion nur für interne Testzwecke gedacht ist, überprüfe ich einfach die OS-Version bei der Anzeige von Alarmen. Sollte sowieso schon UIAlertViewControllers implementiert haben :-) – stonecompass

+1

@Hypo: Wenn du auf iOS7 (+) Alerts unterstützen musst, würde ich einen benutzerdefinierten 'UIViewController' erstellen und den Alert-Look erzeugen, nicht wirklich viel dazu ... viel Glück und glücklicher Xammie Kodierung ... – SushiHangover

+0

Wahr, und danke! – stonecompass