Показать UIWebView внутри UINavigationController в модальном представлении без NIB - PullRequest
1 голос
/ 17 февраля 2012

У меня есть требование загрузить UIWebView, обернутый в UINavigationController, и показать его в модальном представлении.UINavigationController должен показывать панель навигации вверху с кнопкой «назад» (я не нашел кнопку «назад», поэтому я использовал кнопку «Готово»).Я не должен использовать перо, поэтому я должен делать это только программно.Код должен в основном служить библиотекой, которая может быть интегрирована с любым приложением.Он должен работать как для IPhone, так и для iPad.

Это то, что я сделал до сих пор:

Я создал класс WebViewController -

@interface WebViewController : UIViewController
{
    UIWebView *m_cWebView;
}

@property (nonatomic, retain) UIWebView *m_cWebView;

@end

- (void)loadView
{
    CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
    webFrame.size.height -= self.navigationController.navigationBar.frame.size.height;
    UIWebView *pWebView = [[UIWebView alloc] initWithFrame:webFrame];
    pWebView.autoresizesSubviews = YES;
    pWebView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
    self.view = pWebView;
    pWebView.scalesPageToFit = YES;
    self.m_cWebView = pWebView;
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(back:)];  
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    if( m_cWebView != nil )
    {
        NSURL *url = [NSURL URLWithString:@"http://www.google.co.in"];
        NSURLRequest* request = [NSURLRequest requestWithURL:url];
        [m_cWebView loadRequest:request];
    }
}


- (IBAction)back:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
}


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    return nil;
}

- (id)init
{
    return self;
}

В основномконтроллер представления

@property (retain, atomic) UINavigationController *navCon;

-(IBAction)buttonPressed:(id)sender
{
    if( navCon == nil )
    {
        WebViewController* webViewController = [[WebViewController alloc] init];
        navCon = [[UINavigationController alloc] initWithRootViewController:webViewController];

    }

    [self presentModalViewController:navCon animated:YES];

}

Пока все работает нормально.Теперь мои проблемы:

  1. Я совершенно новичок в мире iOS.Правильный ли приведенный выше код или есть проблемы?
  2. Код должен быть скомпилирован с Xcode 4.2 с ARC, поэтому я предполагаю, что мне не нужно беспокоиться о памяти.
  3. логика для расчета правильного начального размера WebView (я беру размер основного экрана и вычитаю высоту панели навигации)?
  4. Как мне справиться с изменением ориентации, чтобы при изменении ориентации мой вид навигации иWebView оба настраиваются в соответствии с новой ориентацией?

Спасибо

Редактировать:

Я пытался реализовать вращение, но я не смог заставить его работать,willRotateToInterfaceOrientation не вызывается на моем WebViewController, даже если я возвращаю YES из shouldAutorotateToInterfaceOrientation (и этот метод вызывается).Когда я попытался работать с пустым пером (загрузка WebViewController с этим пустым пером), то он работает нормально.

Добавление 5-го требования:

  1. Еще одно дополнительное требование заключается в том, что при этоммодальное диалоговое окно закрывается, представление, представившее это, должно быть в правильной ориентации (то есть, когда модальное диалоговое окно включено, события ориентации также передаются в представление, представившее это модальное представление).

Спасибо

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Я нашел решение проблемы с вращением.Замените

- (id)init
{
    return self;
}

на

- (id)init
{
    if (self = [super init])
        return self;
    return nil;
}

и полностью удалите следующий метод:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    return nil;
}

Глупые ошибки :) Теперь он вращается нормально.1011 * Может ли кто-нибудь еще прокомментировать исходные требования?

1 голос
/ 17 февраля 2012

Некоторые моменты с моей стороны.

  1. Относительно кнопки "Назад" вместо готового:

    self.navigationItem.backBarButtonItem = [[[[UIBarButtonItem alloc] initWithTitle:@ Стиль «Назад»: UIBarButtonItemStylePlain target: nil action: nil] autorelease];

  2. Высота панели навигации всегда равна 44.0f

  3. Выможет обрабатывать изменение ориентации с помощью этих методов:

    • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

    return YES;}

    • (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration {[self AdjustViewViewForOrientation: toInterfaceOrientation];// настраиваем ваши рамки просмотра здесь}

Я не уверен в ваших проблемах с кодом и памятью в этом - поэтому я не могу комментировать их.

Надеюсь, эта информация будет вам полезна.

...