2012年8月21日 星期二

ios : the best way to implement rotation 實現 rotation 的好方式

在開發 app 時候不免需要對翻轉效果做很多克制化,有的需要換掉整個界面,有的需要換背景,一般來說通常都需要針對那種看起來很簡單的東西寫很多程式,做起來很麻煩,真的是件很苦的差事。

下面是幾個我試過的方法

  1. 在 翻轉的時候去重新配置所有元件的位置
  2. 直接在翻轉後去換一個特定方向的 UIViewController
這兩種方法都很麻煩而且費工,簡直就是大茶包一個。


今天發現一個新的方法!
不僅簡單又方便,可以大大省去很多時間,下面這個 Method 是關鍵。

NSBundle UIKit Additions Reference
- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options



不囉唆來一段簡單的範例程式,相信簡單幾行大家就會很快地瞭解了。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
                                         duration:(NSTimeInterval)duration
{
    NSLog(@" do rotation of the view controller");
    
    if( UIInterfaceOrientationIsLandscape(interfaceOrientation) )
    {
        [self viewDidUnload];
        [[NSBundle mainBundle] loadNibNamed: [NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])]
                                      owner: self
                                    options: nil];
        [self viewDidLoad];
        NSLog(@" landscape");
    }
    else
    {
        [self viewDidUnload];
        [[NSBundle mainBundle] loadNibNamed: [NSString stringWithFormat:@"%@", NSStringFromClass([self class])]
                                      owner: self
                                    options: nil];
        [self viewDidLoad];
        NSLog(@" portrait");
    }
}

利用 NSBundle loadNibNamed 的方法在 Rotation 的後去替換掉 Views,如此可以快速地在 NIB 上面拉UI 不需要再去用程式算出每個UIs的位置,這樣的話方便很多。

當然別忘記在 Reload Views之後重新 init 所有的 values與行為,不過我想這應該原本設計客制化的 UIs 的時候就已經做好了。