2014-12-28 6 views
19

Ich versuche herauszufinden, wie der linke Rand in der Hauptansicht der Today-Erweiterung berechnet wird, um den Inhalt an die übrigen Beschriftungen der Heute-Ansicht anzupassen.Wie kann ich den linken Rand der Today-Erweiterung in iOS 8 richtig bestimmen?

Hier ist ein Beispiel mit einem sauberen Xcode-Projekt, das eine Today-Erweiterung verwendet (Ich habe den Hintergrund der Ansicht Farbe hinzugefügt und eine gestrichelte rote Linie gezeichnet, um zu veranschaulichen, wo ich die Hello World ausrichten möchte UILabel).

Das Ergebnis in iPhone 6 Plus Simulator (linke Seite Landschaft, rechte Seite Portrait) aus dem Bild unten:

enter image description here

Im Bild bemerkt, dass die grüne Hauptansicht linke Grenze ist anders plaziert als der App-Name UILabel "testi2". Es scheint auch, dass die rote Linie - Hauptansichten linken Rand Ausrichtung ist in jedem Gerät anders: iPhone 5x, iPhone 6 und iPads.

Das Verhalten kann mit einem sauberen Xcode-Projekt wiedergegeben werden (ich verwende Xcode 6.1.1, iOS 8.1 und Swift):

  1. Erstellen Sie ein leeres Xcode-Projekt (A Single-View-Anwendung)
  2. In
  3. ein neues Ziel: Erweiterungen> Heute Erweiterung
  4. der Heute-Erweiterung Gruppe finden MainInterface.storyboard und machen die Hauptansicht Hintergrund grün und Hallo Welt UILabel Hintergrund rot: enter image description here

Wie richte ich den Hello World UILabel (roter Hintergrund) an der gestrichelten Linie aus? Oder wie ordne ich die Hauptansicht (grüner Hintergrund) an die gestrichelte Linie an?

+0

Das Bild ist kaputt, zumindest hier. "Sie haben eine Seite auf einer Website (i.stack.imgur.com) angefordert, die sich im CloudFlare-Netzwerk befindet. CloudFlare kann die angeforderte Domain (i.stack.imgur.com) derzeit nicht auflösen." –

+0

Eigentlich scheint dies ein StackOverflow-Problem zu sein. Habe gerade ein anderes kaputtes Bild bemerkt, welches ein ortsbezogenes Bild ist. Ignorieren. –

+0

Ok, hier ist ein weiterer Link zum Bild: http://ibin.co/w800/1mDY3ckx95h7 –

Antwort

17

Haben Sie das hier versucht?

Objective-C:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets 
{ 
    return UIEdgeInsetsZero; 
} 

Swift:

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 
     return UIEdgeInsetsZero 
} 

Ansonsten sieht es aus wie Sie sie eingestellt werden müssen manuell nach diesem So-Thread:

EDIT :

Sieht so aus, als ob diese Methode veraltet ist und nicht für Geräte mit> = iOS10 aufgerufen wird. Ich konnte jedoch keine Dokumentation zu einer Alternative finden. Wenn Sie Informationen dazu haben, fügen Sie bitte diesen Beitrag hinzu, damit jeder davon profitieren kann. Stellen Sie sicher, dass bei Verwendung dieser Funktion kein>> iOS10 aufgerufen wird.

Quelle: Apple Documentation

+0

Danke, lass mich das versuchen. Ich bin auf der Suche nach einer Lösung, die * nicht erfordert magische Pixel Werte für jedes Gerät und Ausrichtung einzugeben. –

+1

Das Beispiel (ich benutze Swift, wie in der Frage erwähnt, btw) bietet Ihnen zwar * alle Ränder * aus. Es beantwortet jedoch nicht, wie die Position (rote gestreifte Linie in meinem Screenshot) des Widget-Namens "UILabel" zu berechnen ist. –

+0

Danke, das hat es für mich gelöst. –

5

ich den left Wert der defaultMarginInset von -widgetMarginInsetsForProposedMarginInsets mit gemischten Ergebnissen versucht, mit: Auf den iPhone 5S Bildschirmabmessungen, kann es verwendet werden, um den gleichen Einsatz als Standard-Kalender-Widget von iOS zu erhalten (beachten Sie, dass der rechte Rand des Zeitetiketts mit der blauen Linie ausrichtet):

5S Portrait

5S Landscape

Auf dem iPhone 6 erhalten Sie ähnliche Ergebnisse, d. H. Es richtet sich auch aus. Doch auf iPhone 6 Plus, der Kalender-Widget skaliert irgendwie den Einschub:

6P Portrait

6P Landscape

Beachten Sie, dass in der Landschaft Version, weder die Zeit noch die Linien etwas auszurichten.

Abschließend würde ich sagen, dass Sie sicher defaultMarginInset.left verwenden können, um anständige Ergebnisse zu erhalten.


Swift Code:

class TodayViewController: UIViewController, NCWidgetProviding { 

    var defaultLeftInset: CGFloat = 0 
    var marginIndicator = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     marginIndicator.backgroundColor = UIColor.whiteColor() 
     view.addSubview(marginIndicator) 
    } 

    func widgetMarginInsetsForProposedMarginInsets(var defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 
     defaultLeftInset = defaultMarginInsets.left 

     defaultMarginInsets.left = 0 
     return defaultMarginInsets 
    } 

    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) { 
     marginIndicator.frame = CGRectMake(defaultLeftInset, 0, 10, view.frame.size.height) 
     completionHandler(NCUpdateResult.NewData) 
    } 
} 
+0

Es ist anständig, aber es ist nicht genau. Apple macht das Ausrichten irgendwie, ich frage mich wie. Ich wette, sie haben keine festen Pixelwerte für jedes Gerät und jede Ausrichtung. –

+0

Ich wäre mir da nicht so sicher. Auch, wie Sie auf dem 6 Plus sehen, ist es nicht wirklich auf etwas ausgerichtet. Wenn Sie außerdem die Einfügungen des Reminders-Widgets mit dem Kalenderwidget vergleichen, werden Sie feststellen, dass es überhaupt nichts ausrichtet. Es scheint mir, dass sie nicht so streng darüber sind, leider ... – fabian789

+0

In iPhone 6 Plus Landschaft, der Text "Sie haben keine Termine für morgen geplant." ist perfekt auf den "Tomorrow" -Widget-Titel ("Tomorrow Summary" Today Widget von Apple) abgestimmt. –

4

Meine temporäre Lösung geht wie folgt. Ich verwende konstante Werte für die Einstellung der linken und oberen Ränder. Auf diese Weise kann ich den Inhalt genau so ausrichten, wie er ist, zum Beispiel in Morgen Zusammenfassung Widget.

Zunächst einige Hilfsmethoden zur Bestimmung der Gerätetyp (angepasst von this answer):

struct ScreenSize { 
    static let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width 
    static let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height 
    static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, 
     ScreenSize.SCREEN_HEIGHT) 
    static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, 
     ScreenSize.SCREEN_HEIGHT) 
} 

struct DeviceType { 
    static let iPhone4 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH < 568.0 
    static let iPhone5 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 568.0 
    static let iPhone6 = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 667.0 
    static let iPhone6Plus = UIDevice.currentDevice().userInterfaceIdiom == .Phone 
     && ScreenSize.SCREEN_MAX_LENGTH == 736.0 
    static let iPad = UIDevice.currentDevice().userInterfaceIdiom == .Pad 
} 

Dann widgetMarginInsetsForProposedMarginInsets: Verwendung wie vorgeschlagen I linken und oberen Einschübe überschreiben, wie folgt:

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) 
     -> UIEdgeInsets { 
    var insets = defaultMarginInsets 
    let isPortrait = UIScreen.mainScreen().bounds.size.width 
     < UIScreen.mainScreen().bounds.size.height 

    insets.top = 10.0 
    if DeviceType.iPhone6Plus { 
     insets.left = isPortrait ? 53.0 : 82.0 
    } else if DeviceType.iPhone6 { 
     insets.left = 49.0 
    } else if DeviceType.iPhone5 { 
     insets.left = 49.0 
    } else if DeviceType.iPhone4 { 
     insets.left = 49.0 
    } else if DeviceType.iPad { 
     insets.left = isPortrait ? 58.0 : 58.0 
    } 

    return insets 
} 

Jedoch Das ist nicht die Lösung, nach der ich suche - ich möchte die Hardcoding-Pixelwerte pro Gerät und Orientierung loswerden.

+1

Für iPad Portait solltest du 54 statt 58 verwenden, sonst klappt es für mich – mohlendo

Verwandte Themen