Menangani rotasi UINavigationBar subkelas dengan tombol

Saya telah membuat subkelas UINavigationBar untuk memiliki bilah navigasi khusus dalam aplikasi saya. Bilah ini digunakan kembali pada beberapa pengontrol tampilan dengan gaya tombol Menu yang sama dengan item tombol kiri, itulah sebabnya ia disubklasifikasikan.

Subkelas tersebut kemudian ditambahkan ke bilah navigasi Pengontrol Tampilan di storyboard.

Ini adalah kode dalam subkelas UINavigationBar:

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    UIImage *image = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

-(void)awakeFromNib {
    UIButton *leftButton = [[UIButton alloc]initWithFrame:CGRectMake(7.0f, 7.0f, 38.0f, 29.0f)];
    [leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal];
    [leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:leftButton];
}

Masalahnya adalah Rotasi Perangkat. Saya juga memiliki beberapa kode di appDidFinishLaunching menggunakan API penampilan untuk pengaturan tambahan:

// Custom Navigation Bar appearance setup
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor,
                                                       [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor,
                                                       [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
                                                       UITextAttributeTextShadowOffset,nil]];
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight];
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit];
// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone];

Saat perangkat berputar, semuanya berfungsi dengan benar dalam hal penskalaan batang setinggi yang diharapkan dari 44 hingga 32 piksel. Namun, tombol-tombol tersebut masih muncul di luar bar. masukkan deskripsi gambar di sini

Saya telah melihat beberapa postingan SO lainnya tentang ini, tetapi tidak tahu cara menyelesaikannya dengan benar: iPhone: UINavigationBar dengan tombol - sesuaikan ketinggian

UINavigationBar mengubah ukuran otomatis

Idealnya saya tidak ingin berurusan dengan rotasi otomatis di View Controller karena UINavigationBar ini digunakan kembali melalui VC dalam jumlah besar. Menambahkan kode rotasi otomatis berarti masing-masing VC berpotensi memerlukan ini juga?

EDIT - jawaban berikut Jika saya mengubah awakeFromNib untuk menyertakan yang berikut:

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
    UIImage *menuBgImage = [UIImage imageNamed:@"menuBarItem"];
    UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithImage:menuBgImage landscapeImagePhone:menuBgImage style:UIBarButtonItemStylePlain target:nil action:@selector(menuItemPressed:)];
    ni.leftBarButtonItem = b;
    self.items = @[ni];

Saya memiliki masalah UIBarButtonItemStylePlain yang merusak gambar: masukkan deskripsi gambar di sini

Jika saya menyelesaikan pengaturan sebelumnya dengan initWithCustomView dan menggunakan leftButton dari kode aslinya. Dengan tombol kiri menggunakan ukuran otomatis untuk tinggi- saya kemudian mendapatkan gambar yang terentang buruk dalam lanskap?

masukkan deskripsi gambar di sini

EDIT 2 - Gambar tambahan per jawaban masukkan deskripsi gambar di sini


person StuartM    schedule 03.05.2013    source sumber
comment
Anda harus mengatur ukuran otomatis UIbButton yang Anda buat dalam metode wakeFromNib dan juga mengaktifkan properti autoresizesubviews dari navigatonBar.   -  person fibnochi    schedule 03.05.2013
comment
Bisakah Anda mengonfirmasi cara mencapai ini dalam sebuah jawaban?   -  person StuartM    schedule 03.05.2013
comment
*** Tipe properti ilegal, c dalam pemilih pemanggilan, _UIAppearance_setAutoresizesSubviews: saat mencoba menyetel '[[UINavigationBar penampilan] setAutoresizesSubviews:YES];'   -  person StuartM    schedule 03.05.2013


Jawaban (1)


[self addSubview:leftButton];

Itulah masalahnya. Ini bukan cara Anda menambahkan sesuatu ke UINavigationBar! Anda harus memulai dengan UINavigationItem dan menyetel tombolnya ke UIBarButtonItem. Item tombol bilah akan disesuaikan saat bilah navigasi diubah ukurannya.

Berikut adalah contoh sederhana untuk membantu Anda memulai (bisa di awakeFromNib Anda):

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
UIBarButtonItem* b = [[UIBarButtonItem alloc] initWithTitle:@"Howdy"
    style:UIBarButtonItemStyleBordered
    target:self action:@selector(pushNext:)];
ni.leftBarButtonItem = b;
self.items = @[ni];

Namun, perhatikan bahwa ini tidak akan berfungsi jika Anda menggunakan UINavigationBar ini sebagai bagian dari UINavigationController! Tombol bilah kiri akan ditekan oleh navigationItem pengontrol tampilan. Jika ini adalah bagian dari antarmuka navigasi standar, mintalah setiap pengontrol navigasi menambahkan item tombol bilah kiri.

Anda juga tidak boleh menerapkan drawRect. Atur gambar latar belakang bilah navigasi.

person matt    schedule 03.05.2013
comment
Tahukah Anda lebih banyak tentang memulai dengan UINavigationItem yang tidak tersedia di API tampilan, bukan? - person StuartM; 03.05.2013
comment
Saya tidak mengerti cara mengakses UINavigationItem yang dibuat oleh subkelas dari dalam subkelas UINavigationBar. Tolong beri tahu saya informasi lainnya - person StuartM; 03.05.2013
comment
Anda juga tidak melakukan addSubview menggunakan API penampilan. Anda hanya melakukannya di subkelas. Jadi maksud saya, daripada melakukan itu, lakukan dengan cara yang benar: buat UINavigationItem, atur leftBarButtonItem-nya, dan dorong ke bilah navigasi. - person matt; 03.05.2013
comment
Terima kasih Matt. Lalu apa cara yang benar untuk menerapkan ini? Sepenuhnya melalui penampilan API atau bagian dengan subkelas juga? Saya tidak yakin bagaimana cara mengatur latar belakang dari dalam subkelas selain drawInRect, atau apakah Anda bermaksud mengatur latar belakang di API penampilan? - person StuartM; 03.05.2013
comment
Tidak masalah, karena Anda sudah punya subkelas. Panggil saja setBackgroundImage di awakeFromNib Anda. - person matt; 03.05.2013
comment
Saya telah mengganti [image drawInRect... dengan [self setBackgroundImage:image forBarMetrics:UIBarMetricsDefault]; dan sekarang tidak ada gambar latar belakang yang muncul sama sekali? - person StuartM; 03.05.2013
comment
Sayangnya itu tidak berhasil, latar belakang tidak ditampilkan dalam lanskap atau potret. Sehubungan dengan pengubahan ukuran tombol, saya telah mengedit pertanyaan dengan informasi lebih lanjut tentang masalah yang saya hadapi sekarang - person StuartM; 03.05.2013
comment
Latar belakang diselesaikan dengan tidak mengganti drawRect dan menggunakan self setBackground... di wakeFromNib. Secara khusus, drawRect yang tidak diganti membuatnya ditampilkan, tetapi masih ada masalah pengubahan ukuran - person StuartM; 03.05.2013
comment
Jangan gunakan UIBarButtonItemStylePlain. Anda harus membuat item tombol bilah dengan initWithCustomView, dan tampilannya harus berupa UIImageView yang berisi gambar Anda. - person matt; 03.05.2013
comment
Ya, itu adalah bagian terakhir dari editan saya di atas. Saya telah mencoba dengan initWithCustomView memuat UIButton atau UIImageView dan keduanya memiliki efek yang sama seperti yang ditunjukkan pada tangkapan layar terakhir di atas. - person StuartM; 03.05.2013
comment
Setel contentMode tampilan gambar ke sesuatu yang lebih baik, seperti mungkin UIViewContentModeCenter. Hal ini akan menjaga gambar agar tidak melebar ketika tampilan gambar diubah ukurannya. Anda mungkin perlu bereksperimen dengan mode yang berbeda sampai Anda menemukan mode yang tepat... :) - person matt; 03.05.2013
comment
terima kasih, sayangnya kurang beruntung dengan ini. Saya telah memeriksa setiap opsi untuk contentMode dan masih mengalami masalah yang sama. Gambarnya sesuai tangkapan layar atau ukuran asli penuh (seperti potret) yang berarti terlalu besar untuk bilah navigasi :/ - person StuartM; 03.05.2013
comment
Benar-benar? Bagaimana dengan UIViewContentModeScaleAspectFit? Harus menjaga aspeknya tetap benar sekaligus membuatnya sesuai dengan ketinggian yang lebih kecil. - person matt; 03.05.2013
comment
Saya telah menambahkan gambar yang menunjukkan kode/hasil pertanyaan lagi - person StuartM; 03.05.2013
comment
Kecuali itu benar-benar gambar yang diubah ukurannya dengan benar?? Terlihat agak aneh, dan perlu diselaraskan sekarang... Saya menambahkan margin kiri dan atas yang dapat diubah ukurannya sehingga menurut saya margin tersebut akan pas pada tempatnya - person StuartM; 03.05.2013
comment
Diterima sebagai jawaban karena memutuskan untuk tidak memberikan pemandangan ini dalam lanskap, terbukti sulit untuk sesuatu yang sederhana :). Saya memiliki beberapa masalah dengan judul tetapi akan mengajukan pertanyaan baru, terima kasih atas bantuan Anda @matt - person StuartM; 04.05.2013