2016-02-20 125 views
1

我在默認視圖的子視圖中使用一個視圖。我試圖將它的高度和寬度設置爲與超級視圖相同,當它改變方向時。首先,當應用程序加載肖像模式時,此子視圖採用完美的高度寬度,但當第二次更改爲肖像模式時,它不會更改高度,寬度。 在負載: -當我改變方向我的視圖的高度和寬度不會改變

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

方法: -

- (void) orientationChanged:(NSNotification *)note 
{ 
    UIDevice * device = note.object; 
    switch(device.orientation) 
    { 
     case UIDeviceOrientationPortrait: 
      NSLog(@"Portrait"); 
      NSLog(@"View Height %f",self.view.frame.size.height); 
      NSLog(@"View Width%f",self.view.frame.size.width); 

      view1.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 

      NSLog(@"View1 Height %f",view1.frame.size.height); 
      NSLog(@"View1 Width%f",view1.frame.size.width); 

      break; 

     case UIDeviceOrientationLandscapeRight: 
      NSLog(@" LanScapRight"); 


      view1.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width); 



      break; 
     case UIDeviceOrientationLandscapeLeft: 

      NSLog(@" LandScapLeft"); 

      view1.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 


     default: 
      view1.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height); 


      NSLog(@"Default"); 

      //view1.frame=CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.height, self.view.frame.size.width); 


      break; 
    }; 
} 

輸出:-(問題)

2016-02-20 01:29:15.907 Editing[4999:95632] Portrait 
[![2016-02-20 01:29:15.910 Editing\[4999:95632\] View Height 568.000000 
2016-02-20 01:29:15.910 Editing\[4999:95632\] View Width320.000000 
2016-02-20 01:29:15.911 Editing\[4999:95632\] View1 Height 568.000000 
2016-02-20 01:29:15.912 Editing\[4999:95632\] View1 Width320.000000 
2016-02-20 01:29:39.090 Editing\[4999:95632\] LanScapRight 
2016-02-20 01:29:40.364 Editing\[4999:95632\] Default 
2016-02-20 01:29:41.645 Editing\[4999:95632\] LandScapLeft 
2016-02-20 01:29:41.646 Editing\[4999:95632\] Default 
2016-02-20 01:29:43.316 Editing\[4999:95632\] Portrait 
2016-02-20 01:29:43.317 Editing\[4999:95632\] View Height 320.000000 
2016-02-20 01:29:43.317 Editing\[4999:95632\] View Width568.000000 
2016-02-20 01:29:43.317 Editing\[4999:95632\] View1 Height 320.000000 
2016-02-20 01:29:43.318 Editing\[4999:95632\] View1 Width568.000000] 

enter image description here

enter image description here

+0

你有沒有正當理由不使用autolayout? –

+0

smit是你的問題解決? –

+0

@ elio.d是的,我想把日曆放在中心。 –

回答

1

由於界面方向的改變,更新用​​戶界面是一個相當常見的任務,因此有一個很好的方法可以做到這一點。

解決方案1:

如果您使用的是基於幀的佈局(如您的示例代碼),建議把你的框架設置代碼到視圖的layoutSubviews作爲賈恩·格雷夫評論。要做到這一點,你必須繼承UIView。每當視圖邊界發生變化時,將調用layoutSubviews方法,因此您不必觀察有關接口方向的通知,並且您還可以對其他尺寸變化事件做出反應,例如,多任務分割視圖。下面是一個超小例子,如何繼承的UIView和實施布點:

// MyView.h

#import <UIKit/UIKit.h> 

@interface MyView : UIView 

@property (strong) UIView* view1; 
@property (strong) UIView* calendar; 

@end 

// MyView.m

#import "MyView.h" 

@implementation MyView 

- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     self.view1 = [[UIView alloc] init]; 
     self.view1.backgroundColor = [UIColor grayColor]; 
     [self addSubview:self.view1]; 
     self.calendar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)]; 
     self.calendar.backgroundColor = [UIColor redColor]; 
     [self.view1 addSubview:self.calendar]; 
    } 
    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.view1.frame = self.bounds; 
    self.calendar.center = self.view1.center; 
} 

@end 

如果設置一個MyView的實例到viewcontroller的視圖屬性它只是工作。

解決方案2:

解決方案1一般可以使用,但在特定情況下可以布點通過autoresizingmasks來完成。 (這裏我必須再次向Jan Greve說,他在回答中推薦了這一點。)現在你不需要繼承UIView的所有東西都可以從視圖控制器處理。你可以插入這樣的東西到viewDidLoad

UIView* view1 = [[UIView alloc] initWithFrame:self.view.frame]; 
view1.backgroundColor = [UIColor grayColor]; 
[self.view addSubview:view1]; 
view1.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

UIView* calendar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)]; 
calendar.backgroundColor = [UIColor redColor]; 
[view1 addSubview:calendar]; 
calendar.center = view1.center; 
calendar.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; 
+0

你的第二個解決方案是工程..謝謝兄弟..使用這個不需要設置任何方向的方法.. –

+0

但它會隱藏狀態欄。 –

+0

在iPhone上以橫向模式隱藏狀態欄是默認行爲(請檢查Safari例如)。它獨立於視圖佈局。 – fabe

1
[self.view setNeedsDisplay]; 

在上面的開關盒上使用此代碼,此代碼用於重新加載 視圖,以便您可以獲取更新的視圖寬度和高度。

+0

這不適用於我,但感謝分享 –

1

如果您只是希望視圖具有超級視圖的界限而不使用自動佈局,則只要超級視圖的界限發生變化,具有靈活高度和寬度的自動調整遮罩應該簡單地設置正確的幀。

編輯

你的子視圖的框架的原點設置爲上海華盈的起源 - 我懷疑這不是預期的。如果超視圖從(0,0)移開,這會將子視圖的原點移動兩倍於窗口的移位。

+0

是的,你是正確的自動調整大小從尺寸檢查是最好的方式,但我想放置一個日曆在此視圖的中心。如果我將使用自動調整大小,然後我的calander不會獲得中心值。 –

+0

[_calendar setCenter:CGPointMake(_view1.frame.size.width/2,_view1.frame.size.height/2)]; –

+1

這不僅僅是面向變化的問題。外部顯示鏈接怎麼樣?你應該在'layoutSubviews'中處理你的佈局。 – SmokeDispenser

相關問題