ios - ubicacion - no puedo activar localizacion iphone
¿Cómo determinar correctamente el margen izquierdo de la extensión Hoy en iOS 8? (3)
Estoy intentando averiguar cómo calcular el margen izquierdo en la vista principal de la extensión Hoy para alinear el contenido con el resto de las etiquetas de la vista Hoy.
Aquí hay un ejemplo con un proyecto de Xcode limpio que usa las extensiones de Hoy (he agregado color a los fondos de la vista y dibujé una línea roja discontinua para ilustrar dónde me gustaría alinear la UILabel
Hello World).
El resultado en el simulador de iPhone 6 Plus (paisaje del lado izquierdo, retrato del lado derecho) se puede encontrar en la siguiente imagen:
En la imagen, observe que el límite izquierdo de la vista principal verde se coloca de manera diferente en relación con el nombre de la aplicación UILabel
"testi2". También parece que la línea roja - las vistas principales del borde izquierdo son diferentes en cada dispositivo: iPhone 5x, iPhone 6 y iPads.
El comportamiento se puede reproducir utilizando un proyecto Xcode limpio (estoy usando Xcode 6.1.1, iOS 8.1 y Swift):
- Crear un proyecto Xcode vacío (una aplicación de vista única)
- Agregar un nuevo objetivo: Extensiones> Extensión de hoy
- En el grupo de extensiones de Hoy, encuentre MainInterface.storyboard y haga que la vista principal de fondo sea verde y Hello world
UILabel
fondo rojo:
¿Cómo puedo alinear el Hello World UILabel
(fondo rojo) con la línea discontinua? O ¿cómo puedo alinear la vista principal (fondo verde) con la línea discontinua?
¿Has probado este?
Objetivo-C :
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
return UIEdgeInsetsZero;
}
Rápido:
func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
return UIEdgeInsetsZero
}
De lo contrario, parece que tendrás que configurarlos manualmente de acuerdo con este So-Thread :
EDITAR:
Parece que este método está en desuso y no se llama a dispositivos que ejecutan> = iOS10. Sin embargo no pude encontrar ninguna documentación sobre una alternativa. Si tiene alguna información sobre esto, por favor agregue a esta publicación para que todos puedan beneficiarse. Solo asegúrese de que al usar esta función no se llamará en> = iOS10 .
Fuente: Documentación Apple
Intenté usar el valor left
de defaultMarginInset
de -widgetMarginInsetsForProposedMarginInsets
con resultados mixtos: en las dimensiones de la pantalla del iPhone 5S, se puede usar para obtener el mismo recuadro que el widget de calendario predeterminado de iOS (tenga en cuenta que el margen correcto del tiempo se alinea con la etiqueta con la línea azul):
En el iPhone 6, obtienes resultados similares, es decir, también se alinea. Sin embargo, en el iPhone 6 Plus, el widget del calendario de alguna manera escala la inserción:
Tenga en cuenta que en la versión horizontal, ni el tiempo ni las líneas se alinean con nada.
En conclusión, diría que puede usar de forma segura defaultMarginInset.left
para obtener resultados decentes.
Código SWIFT:
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)
}
}
Mi solución temporal es la siguiente. Estoy usando valores constantes para establecer los márgenes izquierdo y superior. De esta manera puedo alinear el contenido exactamente como está, por ejemplo, en el widget Resumen de mañana .
Primero, algunos métodos de ayuda para determinar el tipo de dispositivo (adaptado de esta respuesta ):
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
}
Luego, usando widgetMarginInsetsForProposedMarginInsets:
como se sugiere, sobrescribo las inserciones izquierda y superior de la siguiente manera:
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
}
Sin embargo, esta no es la solución que estoy buscando, me gustaría deshacerme de los valores de píxeles de dispositivo por dispositivo por orientación.