Storyboard,AutoLayout使っていませんでした…
アプリ内でセットした画像を表示する機能でした。
ハードコードですが悪しからず…
-(void)awakeFromNib
{
[super awakeFromNib];
}
-(id)init{
NSLog(@"init");
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefoltChenge:) name:NSUserDefaultsDidChangeNotification object:nil];
}
return self;
}
-(void)userDefoltChenge:(NSNotification *)notification
{
[self uploadimage];
}
-(void)uploadimage
{
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.ID"];
NSData* imageData = [sharedDefaults objectForKey:@"image"];
[imageview setImage:[[UIImage alloc] initWithData:imageData]];
NSLog(@"");
}
- (void)viewDidLoad {
NSLog(@"viewDidLoad");
[super viewDidLoad];
[self setPreferredContentSize:CGSizeMake(self.view.bounds.size.width,300)];
imageview = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
[self.view addSubview:imageview];
UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(0, 0, 300, 300);
[button addTarget:self action:@selector(didButtonTapEvent:) forControlEvents:UIControlEventTouchUpInside];
[imageview addSubview:button];
imageview.userInteractionEnabled = YES;
[self uploadimage];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
-(void)didButtonTapEvent:(UIButton *)button
{
[self.extensionContext openURL:[NSURL URLWithString:@"ID://"] completionHandler:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
completionHandler(NCUpdateResultNewData);
}
-(UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
return UIEdgeInsetsMake(10,
(self.view.bounds.size.width-300)/2,
10,
(self.view.bounds.size.width-300)/2);
}
そのままでもiPhoneでは、問題ないが…
iPadで表示すると画像が約1/3しか表示されませんでした。
methodの呼ばれる順番とwidgetMarginInsetsForProposedMarginInsetsでの、安易な設定が原因でした。
methodの呼び出される順番
↓の順番で呼ばれる為、init後に呼ばれると勘違いしていた。
2014-12-22 11:49:13.678 AppExtention[3918:77730] init
2014-12-22 11:49:13.683 AppExtention[3918:77730] viewDidLoad
2014-12-22 11:49:13.704 AppExtention[3918:77730] widgetMarginInsetsForProposedMarginInsets
2014-12-22 11:49:13.731 AppExtention[3918:77730] wigetPerformUpdate
2014-12-22 11:49:13.791 AppExtention[3918:77730] viewWillAppear
画像を表示するだけであれば
↓へ変更すれば、全ての端末でセンタリングされた状態で表示された。
//省略
- (void)viewDidLoad {
NSLog(@"viewDidLoad");
[super viewDidLoad];
imageView = [[UIImageView alloc]init];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = imageView.frame;
[button addTarget:self action:@selector(didButtonTapEvent:) forControlEvents:UIControlEventTouchUpInside];
[imageView addSubview:button];
imageView.userInteractionEnabled = YES;
[self uploadimage];
}
//省略
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"viewWillAppear");
[self setPreferredContentSize:CGSizeMake(self.view.bounds.size.width,300)];
imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, 300);
button.frame = imageView.frame;
}
//省略
-(UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
NSLog(@"widgetMarginInsetsForProposedMarginInsets");
return UIEdgeInsetsMake(10,
0,
10,
0);
}
//省略
あとがき
iPadでの表示不具合は、他のアップデートの審査のタイミングで指摘されました。
初回の申請時は、通過していたのでチェックしていませんでした。
今回、LaunchScreen.xibでiPhone6,iPhone6Plusの画面対応をした為、iPadの挙動が変化した可能性があります。検証していませんが、新たに画面対応する場合、検証をすることをおすすめします。