0

私はiOSプログラミングにまったく慣れていません。縦向きと横向きに別のビューが必要なアプリを開発しています。ビューが異なっていても、ボタンやその他のコントロールは両方のビューで同じです。したがって、ボタン/ラベルから両方のビューのView Controllerへの同じ接続を維持したいと考えています。ビューコントローラーでラベルの値を変更すると、表示しているビューに関係なくビューで変更されるはずです。

今私が直面している問題は、ストーリー ボードのアイテムに 2 つの異なるルート ビューを追加できないことです。メイン ビューに 2 つの異なるサブ ビューを追加しようとしました。そうすればビューを作成できますが、両方のビューのボタンを単一の接続に接続することはできません。例えば、

@property (strong, nonatomic) IBOutlet UIButton *buttonNext;    

1 つのビューでのみ次のボタンに接続できます。

この問題を回避するために、ストーリー ボードに 2 つの異なるビューを作成し、両方に同じビュー コントローラーを追加しました。次に、次のように各ビューのセグエを作成しました。

@property (strong, nonatomic) IBOutlet UIView *portraitView;
@property (strong, nonatomic) IBOutlet UIView *landscapeView;

そして、私のView Controllerに追加しました:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self adjustViewsForOrientation:toInterfaceOrientation];
}

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
//NSLog(self.view.restorationIdentifier);
if (orientation == UIInterfaceOrientationMaskLandscape || orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
{
    if(self.landscapeView == nil)
    {
        self.landscapeView =[[UIView alloc] init];
    }
   self.view = landscapeView;
}
else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
{
    self.view = portraitView;
}
}

問題は、2 番目のビューが正しく読み込まれていないことです。最初は nil としてロードされています。コードでビューを初期化しても、ビュー内のサブビュー/コントロールは初期化されません。私は過去3日間これにこだわっています。どんな助けでも大歓迎です。

編集1:

ここにサンプル コードを追加しました: http://cl.ly/2z3f3E290f0R

4

2 に答える 2

3

Uはシングルビューでこれを試すことができます:

初め

メソッドでは、デバイスの向きviewDidLoadのコード

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(orientationChanged) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

2番

OrientationChangedのメソッド

-(void)orientationChanged {

    //Check for Portrait Mode
    if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
    {
       x=25; y=30;
    }
    //Lanscape mode
    else {
       x=50; y=40;
    }

    [button setFrame:CGRectMake(x, y, 80, 80)];
}

ここでは、'X' と 'Y' を好きなように取ることができます。

このメソッドは、デバイスが回転するたびに常に呼び出されます。

うまくいけば、それはあなたを助けるでしょう.

ありがとう。

于 2013-03-11T05:21:30.390 に答える
0

これを試して

 UIDeviceOrientation newOrientation = [[UIDevice currentDevice] orientation];
        if (newOrientation != UIDeviceOrientationUnknown && newOrientation != UIDeviceOrientationFaceUp && newOrientation != UIDeviceOrientationFaceDown)
        {
            if(orientation != newOrientation)
            {
                //ORIENTATION HAS CHANGED. Do orientation logic
                if(
                   (newOrientation == UIDeviceOrientationLandscapeLeft || newOrientation == UIDeviceOrientationLandscapeRight)&&(orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown))
                {
                    NSLog(@"Changed orientation to Landscape");
                    // Clear the current view and insert the orientation-specific view
                    [self clearCurrentView];
                    [self.view insertSubview:titleLandscapeView atIndex:0];
                }
                else if (
                         (newOrientation == UIDeviceOrientationPortrait || newOrientation == UIDeviceOrientationPortraitUpsideDown)&&(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight))
                {
                    NSLog(@"Changed orientation to Portrait");
                    // Clear the current view and insert the orientation-specific view
                    [self clearCurrentView];
                    [self.view insertSubview:titlePortraitView atIndex:0];
                }
                orientation = newOrientation;
            }

 -(void) clearCurrentView{
        if (titleLandscapeView.superview){
            NSLog(@"clear titleLandscapeView");
            [titleLandscapeView removeFromSuperview];
        } else if (titlePortraitView.superview){
            NSLog(@"clear titlePortraitView");
            [titlePortraitView removeFromSuperview];
        } else
        {
            NSLog(@"Neither titleLandscapeView nor titlePortraitView");
        }
    }
于 2013-03-11T07:27:32.060 に答える