UINavigationController: применить общие отступы / поля для всех представлений контроллера Popped View - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть UINavigationController, и я хотел бы, чтобы представление каждого контроллера представления, помещенного в стек, имело общий отступ / поле (например, 25 пикселей со всех сторон).Каков наилучший способ сделать это?

Я изначально думал, что смогу реализовать UINavigationControllerDelegate и внутри методов navigationController:didShowViewController:animated или navigationController:willShowViewController:animated просто изменить кадр контроллера представления, который должен был бытьотображается.Это, кажется, не имеет никакого эффекта, хотя.

Я пытался сделать то же самое внутри методов контроллера вида viewDidAppear и viewWillAppear, но это также не сработало.В идеале я не хочу помещать какую-либо логику в контроллеры в любом случае, так как они не всегда могут использоваться внутри контроллера навигации.

Последняя идея, которую я еще не пробовал, заключается в создании «оболочки»Msgstr "UIViewController, что на самом деле будет помещено в этот стек.Эта обертка добавит реальное представление контроллера представления как подпредставление с рамкой, которая обеспечит желаемое поле.Недостатком здесь является то, что мне нужно будет создать подкласс UINavigationController и переопределить pushViewController:animated, где обертка будет инициализирована и отправлена.В документации Apple указано, что UINavigationController не предназначен для использования в подклассах.

Заранее спасибо.

1 Ответ

1 голос
/ 01 июля 2011

Я решил это, поместив «обертку» UIView вокруг UIViewController view вместо самого UIViewController. Затем представление-обертка дополняет подпредставление, устанавливая фрейм подпредставления в методе layoutSubviews.

Я приложил код, который использовал для удобства. Чтобы использовать, замените UINavigationController на PaddedNavigationController и установите свойство PaddedNavigationController s insets.

PaddedNavigationController.h:

#import <Foundation/Foundation.h>

@interface PaddedNavigationController : UINavigationController
{
    UIEdgeInsets _insets;
}

@property (nonatomic, assign) UIEdgeInsets insets;

@end

PaddedNavigationController.m

#import "PaddedNavigationController.h"

@interface PaddedView : UIView
{
    UIView *_view;
    UIEdgeInsets _insets;
}

@property (nonatomic, assign) UIEdgeInsets insets;

+ (PaddedView *) wrapView:(UIView *)view withInsets:(UIEdgeInsets)insets;
- (id) initWithView:(UIView *)view insets:(UIEdgeInsets)insets;

@end


@implementation PaddedNavigationController

@synthesize insets = _insets;

- (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    //check if the UIViewController's view has already been wrapped by the PaddedView; don't want to wrap it twice
    if(![viewController.view isKindOfClass:[PaddedView class]])
    {
        viewController.view = [PaddedView wrapView:viewController.view withInsets:self.insets];
    }
    [super pushViewController:viewController animated:animated];
}

- (void) setInsets:(UIEdgeInsets)insets
{
    _insets = insets;

    //loop through this navigation controller's view controllers and set the new insets on any PaddedViews
    for(UIViewController *viewController in self.viewControllers)
    {
        if([viewController.view isKindOfClass:[PaddedView class]])
        {
            PaddedView *padded = (PaddedView *)viewController.view;
            padded.insets = insets;
        }
    }
}

@end


@implementation PaddedView

@synthesize insets = _insets;

+ (PaddedView *) wrapView:(UIView *)view withInsets:(UIEdgeInsets)insets
{
    return [[[PaddedView alloc] initWithView:view insets:insets] autorelease];
}

- (id) initWithView:(UIView *)view insets:(UIEdgeInsets)insets
{
    if(self = [super initWithFrame:view.frame])
    {
        _insets = insets;
        self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        _view = [view retain];
        [self addSubview:view];
    }
    return self;
}

- (void) dealloc
{
    [_view release];
    [super dealloc];
}

- (void) layoutSubviews
{
    //apply the insets to the subview
    _view.frame = CGRectMake(self.insets.left, self.insets.top, self.frame.size.width - self.insets.left - self.insets.right, self.frame.size.height - self.insets.top - self.insets.bottom);
}

- (void) setInsets:(UIEdgeInsets)insets
{
    _insets = insets;
    //we need to re-layout the subviews as the insets have changed
    [self layoutSubviews];
}

@end
...