Bagaimana cara membuat Aplikasi menggunakan templat Aplikasi Tampilan Tunggal di mana jendela utama tidak berputar tetapi rootViewController dan yang lainnya berputar otomatis?

Apple melakukannya di CIFunHouse tetapi karena kodenya dijelaskan dengan buruk dalam hal itu, tidak mungkin untuk mengetahui bagaimana mereka melakukannya. Jika Anda menjalankan aplikasi, Anda akan melihat bahwa jendela pratinjau kamera tidak berputar secara otomatis karena pratinjau telah ditambahkan ke jendela tetapi yang lainnya melakukannya.

Apple menggunakan teknik ini pada aplikasi kamera iPad asli mereka.

1
Duck 12 Maret 2017, 22:55

2 jawaban

Jawaban Terbaik

Jadi jawabannya tidak bersih tapi saya bisa memberi Anda perbaikan. Pada titik tertentu jendela aplikasi utama tidak boleh dirotasi secara otomatis seperti sekarang, tetapi pada titik tertentu mulai berputar sesuai dengan rootviewcontroller. Setidaknya kode sumber ini menunjukkan itu. Saya mulai mengembangkan pada akhir iOS 6 dan saya pikir sumber ini ditulis tentang waktu itu. Perbaikan terbaik yang dapat saya temukan untuk mengizinkan semuanya berputar dalam contoh untuk saya tetapi memiliki pratinjau untuk tidak diputar adalah dengan menambahkan jendela kedua. Atur latar belakang jendela utama untuk dihapus. Kemudian tambahkan previewLayer ke jendela kedua di belakang jendela utama. Dalam kode akan terlihat seperti ini.

AppDelegate tampak seperti ini.

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>

@interface FHAppDelegate : UIResponder <UIApplicationDelegate>
{
@private
  CMMotionManager *_motionManager;
}
@property (strong, readonly, nonatomic) CMMotionManager *motionManager;
//future preview window
@property (strong, nonatomic) UIWindow *previewWindow;
@property (assign, readonly, nonatomic) UIDeviceOrientation realDeviceOrientation;

@end

Kemudian di viewDidLoad dari FHViewController alih-alih menambahkan ke jendela utama, saya melakukan ini dan menambahkan di mana mereka mendapatkan jendela utama, saya menambahkan previewView ke sana.

   // we make our video preview view a subview of the window, and send it to the back; this makes FHViewController's view (and its UI elements) on top of the video preview, and also makes video preview unaffected by device rotation
   //nothing special about this viewcontorller except it has
   //-(BOOL)shouldAutorotate{
   //return NO;
   //}

    TestViewController *test = [[TestViewController alloc]initWithNibName:@"TestViewController" bundle:nil];
    FHAppDelegate *delegate = ((FHAppDelegate *)[UIApplication sharedApplication].delegate);
    delegate.previewWindow = [[UIWindow alloc]initWithFrame:window.bounds];
    UIWindow *previewWindow = delegate.previewWindow;
    [window setBackgroundColor:[UIColor clearColor]];

    previewWindow.rootViewController = test;
    previewWindow.windowLevel = UIWindowLevelNormal - 1;

    [previewWindow setBounds:delegate.window.bounds];

    [previewWindow makeKeyAndVisible];
    [previewWindow addSubview:_videoPreviewView];
    [previewWindow sendSubviewToBack:_videoPreviewView];

Karena previewWindow harus memiliki rootviewcontroller dan menentukan rotasi, Anda dapat melihat testviewcontroller saya memiliki autorotate NO. Semoga ini membantu. Ini berfungsi untuk saya di iOS 10.

Sunting: Tampilan pada contoh di atas tidak berputar tetapi animasi jendela pada rotasi buruk secara visual. Itu dapat dihapus dengan mengganti willTransitionToSize

    [UIView setAnimationsEnabled:NO];

Dan setelah selesai

[UIView setAnimationsEnabled:YES];

Lihat versi cepat di GitHub

Untuk iPad membutuhkan Full Screen harus dicentang.

1
agibson007 14 Maret 2017, 11:50

Dengan menggunakan pengontrol navigasi, Anda dapat membuat kategori Objective-C seperti dan menggunakannya di sub viewcontrollers

#import "UINavigationController+Orientation.h"

@implementation UINavigationController (Orientation)

- (NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate {
    return YES;
}

@end

Untuk Swift

extension UINavigationController {

    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return topViewController?.supportedInterfaceOrientations ?? .portrait
    }

    open override var shouldAutorotate: Bool {
        return true
    }

}
0
abdullahselek 12 Maret 2017, 21:29