我的临时解决方案如下。我使用常量值来设置左边距和上边距。通过这种方式,我可以将内容完全对齐,例如,在Tomorrow Summary小部件中。
首先是一些确定设备类型的辅助方法(改编自这个答案):
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
}
然后widgetMarginInsetsForProposedMarginInsets:
按照建议使用我覆盖左侧和顶部插图如下:
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
}
但是,这不是我正在寻找的解决方案 - 我想摆脱对每个设备每个方向的像素值进行硬编码。