これは苦痛であり、iOS 4.2 for iPadsではまだ当てはまります。私がこれを解決する方法はUIView
をサブクラス化してUIViewController
に関連付けることです。私はインターフェースビルダーでこれをやったが、私はこれを何らかの形でコード内で行うこともできると思う。インターフェイスビルダーでUIViewController
のUIViewを選択し、インスペクタウィンドウの右上にある(i)アイコンをクリックします。クラスIDの下でポップアップを押し、下のUIViewサブクラスを選択しました。
アプローチは、このUIViewのサブクラスは、layoutSubviewsメソッドをオーバーライド次UIViewController
を見つけ、それは(このビューのビューコントローラのUIViewController
サブクラスで実装する必要がメソッドである)reactToLayoutメソッドを実装かどうかを決定することです。最初にUIViewController
にreactToLayoutメソッドが存在する場合は、それが呼び出されます。
ビューコントローラでreactToLayout方法は、1つのビューのフレームは、この時点で適切に設定されているので、(viewWillAppear
、ViewDidLoad
とは異なり、あるいはviewDidAppear
)が正常に行うことができるようになりますどの行う必要があるものは何でもありません。オリエンテーションやフレームが変わるたびに呼び出す方法があります。それは痛みですが、レイアウトされた最後のフレームとビューコントローラの内部変数に配置された最後の方向を保存します。新しい方向付けまたはフレーム変更方法の内部レイアウトは、これらをビューの現在のフレーム、要求されたまたは現在の方向と比較して、不必要にレイアウトを何度も繰り返さないようにします。
UILayoutSubviewsView.h
#import <UIKit/UIKit.h>
@interface UILayoutSubviewsView : UIView {
}
@end
UILayoutSubviewsView:
は、ここでは、コードです。メートル
#import "UILayoutSubviewsView.h"
// Create this to avoid a warning that this method does not exist for UIViewControllers
// this is OK since we check to see that it does exist before invoking it
@interface UIViewController(UndocumentedMethodForUIViewController)
-(void) reactToLayout;
@end
@implementation UILayoutSubviewsView
// Pass this up to our view controller if it supports the reactToLayout method
// (this is the whole reason for the class)
-(void) layoutSubviews {
[super layoutSubviews];
// Look for the first next responder that is a UIViewController
UIViewController *ourViewController = nil;
id myNextResponder = [self nextResponder];
while (myNextResponder != nil && ourViewController == nil) {
if ([myNextResponder isKindOfClass:[UIViewController class]]) {
ourViewController = myNextResponder;
}
else {
myNextResponder = [myNextResponder nextResponder];
}
}
// If we got a view controller, then see if it supports the reactToLayout method
if (ourViewController != nil) {
if ([ourViewController respondsToSelector:@selector(reactToLayout)]) {
// Invoke the view controller's reactToLayout method
[ourViewController reactToLayout];
}
}
}
@end
YourViewController.h
#import <UIKit/UIKit.h>
@interface YourViewController : UIViewController {
CGRect lastLayedOutFrame;
UIInterfaceOrientation lastLayedOutOrientation;
}
#pragma mark -
#pragma mark Instance Methods
-(id) init;
-(void) reactToLayout;
@end
YourViewController.m
私は私のために仕事をする あなたはcurrentSizeを使用することができます簡単な解決策があると思います
#import "YourViewController.m"
#pragma mark Private Interface Category
@interface YourViewController()
-(void) setViewForCurrentFrameAndRequestedOrientation:(UIInterfaceOrientation) interfaceOrientation;
@end
@implementation YourPadViewController
-(id) init {
// First our super then set ourselves up
if (self = [super initWithNibName:@"YourViewController" bundle:nil]) {
// Initialize some basic stuff
lastLayedOutFrame = CGRectZero;
lastLayedOutOrientation = UIDeviceOrientationUnknown;
}
return self;
}
-(void) viewWillAppear:(BOOL) animated {
[super viewWillAppear:animated];
// Make sure we're showing the right stuff in the right place
[self setViewForCurrentFrameAndRequestedOrientation:UIDeviceOrientationUnknown];
}
-(void) viewDidAppear:(BOOL) animated {
[super viewDidAppear:animated];
// Make sure we're showing the right stuff in the right place
[self setViewForCurrentFrameAndRequestedOrientation:UIDeviceOrientationUnknown];
}
-(void) reactToLayout {
// Make sure we're showing the right stuff in the right place
[self setViewForCurrentFrameAndRequestedOrientation:UIDeviceOrientationUnknown];
}
#pragma mark -
#pragma mark Rotation Support
-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return YES;
}
// This is called right before the actual rotation
-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval) duration {
[super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];
// Make sure we're showing the right stuff in the right place
[self setViewForCurrentFrameAndRequestedOrientation:interfaceOrientation];
}
// Make the necessary adjustments for the different view orientations
-(void) setViewForCurrentFrameAndRequestedOrientation:(UIInterfaceOrientation) interfaceOrientation {
// Set up the requested orientation (need this to handle the Unknown case)
UIInterfaceOrientation requestedOrientation;
if (interfaceOrientation != UIDeviceOrientationUnknown) {
requestedOrientation = interfaceOrientation;
}
else {
requestedOrientation = [[UIDevice currentDevice] orientation];
}
// See if we have anything to do
if (!(CGRectEqualToRect(self.view.frame, lastLayedOutFrame) && lastLayedOutOrientation == requestedOrientation)) {
// Do whatever needs to be done
// Record our last layed out frame and orientation
lastLayedOutFrame = self.view.frame;
lastLayedOutOrientation = requestedOrientation;
}
}
あなたは手の込んだていただけますか?境界は両方の場合とも同じ{320、460}であり、中心も変わらない。 – user130444
フレームのサイズが変更されない理由を尋ねる場合は、スプリングとストラットが適切に設定されていますか?それが最初にチェックすることです。 –
はい、私のビューは回転したときにサイズが変わります。唯一の問題は、風景のときに作成されるときです。 – user130444