У меня есть требование загрузить 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];
}
До сих пор он работает нормально. Теперь мои вопросы:
- Я совершенно не знаком с iOS. Является ли приведенный выше код правильным или существуют проблемы?
- Код должен быть скомпилирован с Xcode 4.2 с ARC, поэтому я полагаю, что мне не нужно беспокоиться о памяти.
- Правильно ли вычисляется исходный размер WebView (я беру размер основного экрана и вычитаю высоту панели навигации)?
- Как отрегулировать ориентацию, так что при изменении ориентации мой навигационный режим и WebView оба приспосабливаются к новой ориентации?
Благодаря
Edit:
Я попытался реализации с вращением, но я не смог заставить его работать. willRotateToInterfaceOrientation не получает вызов в моем WebViewController, хотя я возвращаю YES из shouldAutorotateToInterfaceOrientation (и этот метод получает вызов). Когда я попытался работать с пустым ником (загрузка WebViewController с помощью этого пустого ниба), тогда он отлично работает.
Добавление 5-е требование:
- еще одно дополнительное требование заключается в том, что, когда это модальные диалоговые увольняет, вид, который представил это, должно быть в правильной ориентации (то есть в то время как модальное диалоговое окно вверх, ориентационные события также передаются в представление, которое представило этот модальный вид).
Благодаря
Hi mrunal, спасибо за подсказку: Кнопка возврата сработала с некоторой настройкой. Я возвращаю YES из mustAutorotateToInterfaceOrientation, но willRotateToInterfaceOrientation не получает вызов. Я хотел бы подчеркнуть, что представление WebViewController - это сам UIWebView. Еще одним дополнительным требованием является то, что, когда этот модальный диалог отклоняется, представление, которое представляло это, должно быть в правильной ориентации (то есть, пока модальный диалог завершен, он также передает события изменения ориентации в представление, которое представляло это модальное представление). –