2012-02-17 2 views
1

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

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

Я создал класс 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 оба приспосабливаются к новой ориентации?

Благодаря

Edit:

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

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

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

Благодаря

ответ

1

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

- (id)init 
{ 
    return self; 
} 

с

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

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

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

Глупых ошибок :) Теперь вращаются нормально.

Может ли кто-то по-прежнему комментировать исходные требования?

1

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

  1. Относительно кнопку назад, вместо сделано:

    self.navigationItem.backBarButtonItem = [[[UIBarButtonItem Alloc] initWithTitle: @ "Назад" стиль: UIBarButtonItemStylePlain цель: ноль действия: ноль] autorelease] ;

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

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

    • (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {

    возвращение ДА; }

    • (пустоты) willRotateToInterfaceOrientation: (UIInterfaceOrientation) Продолжительность toInterfaceOrientation: (NSTimeInterval) продолжительность { [собственной adjustViewsForOrientation: toInterfaceOrientation]; // настроить просмотр кадров здесь }

Я не уверен, что ваши вопросы кода и памяти в том, что - так я не смог прокомментировать над теми.

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

+0

Hi mrunal, спасибо за подсказку: Кнопка возврата сработала с некоторой настройкой. Я возвращаю YES из mustAutorotateToInterfaceOrientation, но willRotateToInterfaceOrientation не получает вызов. Я хотел бы подчеркнуть, что представление WebViewController - это сам UIWebView. Еще одним дополнительным требованием является то, что, когда этот модальный диалог отклоняется, представление, которое представляло это, должно быть в правильной ориентации (то есть, пока модальный диалог завершен, он также передает события изменения ориентации в представление, которое представляло это модальное представление). –

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