Главная » iPhone » Пример iPhone: простой обозреватель Интернета

0

Это один из самых интересных примеров в даной главе. Этот облегченный вариант обозревателя Интернета использует класс simplewebview Шона Хе- бера с внесенными нами усовершенствованиями совместно с адресной строкой, созданной из объекта UITextView. Кроме того, для осуществления ввода используется собственный всплывающий объект uiKeyboard. Когда пользователь вводит URL в адресную строку и нажимает кнопку Go, Web-вид загружает заданную страницу.

Данный пример использует некоторые подмененные методы для объекта UITextView. Ранее в этой главе мы рассмотрели клавиатуры и обсудили значение подмены метода contentMouseUpinView. Это используется для включения или отключения переключения отображения клавиатуры при касании вида. В данном примере мы познакомимся с новой подменой под названием shouldinsertText. Этот метод вызывается всякий раз, когда пользователь нажимает какую-либо клавишу. Данный пример использует ее для проверки, не нажата ли клавиша <Return> (обозначенная на клавиатуре как Go), и в случае, если она нажата, то указывает управляющему виду загрузить новую страницу.

Данный пример работает с Web-объсктами и локальными файлами. Чтобы получить доступ к локальным файлам, надо удалить префикс протокола http://, предшествующий пути к файлу. Как обычно, дайте для загрузки Web- страниц несколько секунд. Чтобы не тратить на этот пример сотни страниц в этой книге, многие из эстетически привлекательных возможностей обозревателя Интернета, например, индикаторы загрузки страниц и симпатичные панели инструментов, были опущены. Помните, это— всего лишь простейший обозреватель Интернета.

Чтобы скомпилировать это приложение из командной строки, воспользуйтесь пакетом инструментов следующим образом:

$ arm-apple-darwin9-gcc -о MyExample MyExample.m SimpleWebView.m ‘Ъ -lobjc -framework Foundation -framework CoreFoundation "b -framework UIKit

Листинги 7.27 и 7.28 содержат код Web-вида и прокрутки, а листинги 7.29 и 7.30 — код основного приложения и основного вида.

/*

By: Sean Heber <sean@spiffytech.com>, J. Zdziarski iApp-a-Day – November, 2007 BSD License

*/

#import <UIKit/UIKit.h> #import <UIKit/UIScroller.h> #import <UIKit/UIWebDocumentView.h>

@interface MyWebView : UIWebDocumentView

{

J

-    (void)gestureEnded:(struct _____ GSEvent *)event;

-    (void)doubleTap:(struct _____ GSEvent *)event;

@end

@ interface SimpleWebview : UlView { MyWebView *webView; UlScroller *scroller; NSURLRequest *urlRequest; CGSize lastSize, size;

}

-(id)initwithFrame: (CGRect)frame; -(id)loadURL: (NSURL *)url; -(void)dealloc; @end

/* By: Sean Heber <sean@spiffytech.com>, J. Zdziarski iApp-a-Day – November, 2007 BSD License */ #import "SimpleWebview.h"

#import <UIKit/UIView-Geometry.h> #import <UIKit/UIView-Rendering.h>

@implementation MyWebView

-   (void) gestureEnded:(struct _____ GSEvent *)event

{

[ super gestureEnded: event ]; [ delegate gestureEnded: event ];

}

-   (void) doubleTap:(struct _____ GSEvent *)event

{

[ super doubleTap: event ]; [ _delegate doubleTap: event ];

}

@end

@implementation SimpleWebView

-(void)view: (UIView*)v didSetFrame:(CGRect)f {

if (v == webView) {

[ scroller setContentSize: f.size ];

}

}

-(void)view:(id)v didDrawinRect:(CGRect)f duration:(float)d {

if (v == webView) {

size = [ webView bounds ].size;

if (size.height != lastSize.height I I size.width != lastSize.width) {

lastSize = size;

[ scroller setContentSize: size ];

-     (void)gestureEnded:(struct _____ GSEvent *)event {

[ webView redrawScaledDocument ] ;

[ webView setNeedsDisplay ];

[ scroller setContentSize: [ webView bounds ].size ];

)

-     (void)doubleTap:(struct _____ GSEvent *)event (

struct timeval tv;

tv.tv_sec = 2; tv.tv_usec = 0;

select(NULL, NULL, NULL, NULL, &tv); [ webView redrawScaledDocument ] ; [ webView setNeedsDisplay ];

[ scroller setContentSize: [ webView bounds J.size ];

)

-(void)dealloc

{

[ urlRequest release ]; [ webView release ); [ scroller release ]; [ super dealloc ] ;

}

-(id)initwithFrame: (CGRect)frame

{

[ super initwithFrame: frame ];

scroller = [ [ UlScroller alloc ] initwithFrame: frame ]; [ scroller setScrollingEnabled: YES ]; [ scroller setAdjustForContentSizeChange: YES ]; [ scroller setClipsSubviews: NO ]; [ scroller setAllowsRubberBanding: YES ]; [ scroller setDelegate: self ]; [ self addSubview: scroller );

webView = [ [ MyWebView alloc ]

initWithFrame: [ scroller bounds ] ]; [ webView setTilingEnabled: YES ]; [ webView setTileSize: frame.size ]; [ webView setAutoresizes: YES]; [ webView setDelegate: self]; [ webView setEnabledGestures: OxFF ]; [ webView setSmoothsFonts: YES ]; [ scroller addSubview: webView ]; return self;

}

"(id)loadURL: (NSURL *)url {

CGPoint’ zero; zero.x = 0; zero.у = 0;

[ scroller scrollPointVisibleAtTopLeft: zero ];

urIRequest = [ [ NSURLRequest requestWithURL: url ] retain ]; [ webView loadRequest: urIRequest ];

}

@end

#import <CoreFoundation/CoreFoundation.h> #import <UIKit/UIKit.h> #import <UIKit/UiTextview.h> #import "SimpleWebView.h"

©interface MyTextView : UiTextview {

}

-   (void)contentMouseUpInView:(id)fp8 withEvent:(struct ________ GSEvent *)fpl2;

-   (BOOL)webView:(id)fp8 shouldlnsertText:(id)character replacingDOMRange:(id)fpl6 givenAction:(int)fp20;

@end

8interface MainView : UlView

{

MyTextView *textField; SimpleWebView *webView; BOOL keyboardEnabled;

}

-   (id)initWithFrame:(CGRect)frame;

-   (void)contentMouseUpInView:(id)_id withEvent:( struct      GSEvent *)_event;

-   (void)enterPressed;

-   (void)dealloc; @end

Winterface MyApp : UiApplication

{

UlWindow *window; MainView *mainView;

}

-   (void)applicationDidFinishLaunching: (NSNotification *)aNotification;

0end

#import "MyExample.h"

int main(int argc, char **argv)

return UIApplicationMain(argc, argv, @"MyApp", @"MyApp");

@implementation MyTextView

-    (void)contentMouseUpInView:(id) id withEvent:(struct       GSEvent *)_event

{

[ _delegate contentMouseUpInView:(id)_id withEvent:_event ];

}

-    (BOOL)webView:(id)fp8 shouldlnsertText: (id)character

replacingDOMRange:(id)fpl6 givenAction:(int)fp20

{

if ( [ character characterAtIndex:0 ] = ‘ \n’) {

[ _delegate enterPressed ]; return NO;

}

return [ super webView:fp8 shouldlnsertText:character replacingDOMRange:fpl6 givenAction:fp20

];

}

@end

@implementation MyApp

-    (void)applicationDidFinishLaunching:(NSNotification *)aNotification { window = [ ( UlWindow alloc ] initWithContentRect:

[ UlHardware fullScreenApplicationContentRect ]

] ;

CGRect rect = [ UlHardware fullScreenApplicationContentRect ]; rect.origin.x = rect.origin.у = O.Of;

mainView = [ [ MainView alloc ] initwithFrame: rect ]; [ window setContentView: mainView ];

[ window orderFront: self ]; [ window makeKey: self ]; [ window _setHidden: NO ];

}

9 end

^implementation MainView

-    (id)initwithFrame:(CGRect)rect {

self = [ super initwithFrame: rect ]; if (nil != self) {

textField = [ [ MyTextView alloc ] initwithFrame: CGRectMake(0, 0, 320, 32) ]; [ textField setDelegate: self ]; [ textField setReturnKeyType: 1 J; [ textField scrollToMakeCaretVisible: YES ]; [ textField setEditable: YES ]; [ textField setText: @"http://" ]; [ self addSubview: textField ] ;

rect.origin.у = 16;

webView = [ [ SiitpleWebView alloc ] initwithFrame: rect ]; [ self addSubview: webView ];

keyboardEnabled = YES;

}

return self;

)

-    (void)enterPressed {

NSURL *url = [ [ NSURL alloc ] initWithString: [ textField text ] ]; keyboardEnabled = NO; [ webView loadURL: url ];

-     (void)contentMouseUpInView:(id)_id

withEvent:(struct ____________ GSEvent *)_event {

if (keyboardEnabled — NO) {

keyboardEnabled = YES; } else {

keyboardEnabled = NO;

}

}

-     (void)dealloc

{

[ self dealloc ]; [ super dealloc ];

}

@end

Как это работает

1.          При порождении приложения создается MainView и вызывается его метод initWithFrame. Этот метод создает объект uiTextview, который будет служить адресным полем, с задаваемыми свойствами клавиатуры, связанными с ним. Также создается класс SimpleWebView, который содержит объекты UIWebDocumentView и UlScroller, используемые для построения Web-вида. Основной вид создает объект uiKeyboard, но пока не добавляет его к виду.

2.           Когда пользователь касается адресной строки, получает уведомления об этом событии ее метод contentMouseUpInView, который, в свою очередь, уведомляет своего делегата — основной вид. Основной вид включает или отключает клавиатуру путем добавления или удаления ее из основного вида.

3.           Как только пользователь начинает ввод в адресной строке, для каждого вводимого символа вызывается метод shouldinsertText. Когда пользователь нажимает клавишу <Return> (обозначенную как Go), уведомляется метод enterPressed делегата.

4. Метод enterPressed скрывает клавиатуру и вызывает метод loadURL объекта SimpleWebView. Тем самым переустанавливается положение прокрутки в (0, 0) и продолжается загрузка новой Web-страницы или файла.

Для дальнейшего изучения

?        Чтобы посмотреть на остальные творения Шона Хебера. посетите Web- узел iApp-a-Day, расположенный по адресу: http://w\vw.iappaday.com.

?        Проверьте наличие прототипов UIWebDocumentView.il и UIScroller.li в каталоге include пакета инструментов. Их можно найти в папке /toolchain/sys/include/UIKit.

?        Глядя на UIScroller.li, поэкспериментируйте с некоторыми из дополнительных методов задания свойств, которые меняют свойства прокрутки. Что еще интересного вы сможете получить от этого класса?

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии