2016-04-02 4 views
1

Я пытаюсь добавить UICollectionView в качестве SubView в свой NavigationBar.Добавить UICollectionView в NavigationBar

[self.navigationController.view addSubview:self.hotspotCollectionView]; 

Кажется, что он работает правильно, но закрывает кнопку «Назад», см. Прилагаемый скриншот. Есть ли какой-либо способ отступать в collectionView, чтобы кнопка «Назад» была правильно видна? Также есть способ увеличить высоту навигационной панели, чтобы я мог использовать большие уменьшенные изображения в моем CollectionView?

Я использую XCode 7 и iOS9.

CollectionView in NavigationBar

+2

Вы пытались добавить collectionview в заголовок navigationItem, как описано в [здесь] (http://stackoverflow.com/questions/8433016/customize-navigation-bar-with-title-view)? – ozgur

ответ

2

мне удалось достичь этой простой пример

screenshot

enter image description here , используя подкласс UINavigationBar и устанавливая представление коллекции для контроллера представления navigationItem.titleView


#import <UIKit/UIKit.h> 

@interface NavigationBar : UINavigationBar 

@end 

#import "NavigationBar.h" 

@implementation NavigationBar 

- (CGSize)sizeThatFits:(CGSize)size 
{ 
    return CGSizeMake(self.superview.bounds.size.width, 80); 
} 

-(void)setFrame:(CGRect)frame { 
    CGRect f = frame; 
    f.size.height = 80; 
    [super setFrame:f]; 
} 

@end 

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@end 

#import "ViewController.h" 
#import "CollectionViewCell.h" 

@interface ViewController()<UICollectionViewDelegate, UICollectionViewDataSource> 
@property (nonatomic, weak) UICollectionView *collectionView; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init]; 

    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 300, 80) collectionViewLayout:layout]; 
    collectionView.backgroundColor = [UIColor clearColor]; 
    self.navigationItem.titleView = collectionView; 
    [collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; 
    collectionView.delegate = self; 
    collectionView.dataSource = self; 
} 


-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 5; 
} 

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CollectionViewCell *cell = (CollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor orangeColor]; 
    return cell; 
} 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(50, 50); 
} 

@end 

Я установил собственный Панель навигации в Interface Builder

screenshot


Отказ от ответственности 1: Я не могу обещать, что это решение для будущего доказательства или будет работать в любом случае. Я не тестировал его такими вещами, как авто-макет или ротация.

Отказ от ответственности 2: Лично я буду реализовывать любой источник данных/делегат независимо от контроллера вида. Для просмотра таблиц и коллекций я использую свой собственный рост OFAPopulator.


Вот пример кода: gitlab.com/vikingosegundo/collectionview-in-navigationbar/tree/... Есть еще некоторые особенности пользовательского интерфейса в ней. Но, вероятно, этого следовало ожидать. Я думаю, что Apple просто не считала, что мы меняем высоту. На самом деле, я никогда не видел приложение с разной высотой для его навигационной панели. Но код отвечает на ваш вопрос. Дайте ему больше любви, и это может быть полезно для вас.

+0

Разве это не сделает все навигационные панели такими?Кроме того, я не пробовал ваш подход, но это все равно будет охватывать кнопку «Назад», например. –

+0

нет, не будет закрывать кнопку возврата. см. новый скриншот. – vikingosegundo

+0

* Не было бы так, чтобы все навигаторы выглядели так? * Только там, где вы используете пользовательский класс. И вы можете добавить метод переключения между обычным стилем и обычаем. – vikingosegundo

1

Я думаю, что лучшее решение в данной ситуации является использование пользовательского UIView подкласса, который имитирует UINavigationBar. И setNavigationBarHidden:YES animated:NO соответствует UINavigationController.

+0

Если вы сделаете это и нажмете на свой навигационный контроллер, ваш UIView не исчезнет? –

Смежные вопросы