Главная » iPhone » Виды Web-документа и прокрутки iPhone

0

В главе 3 мы познакомились с объектом UITextView и его методом setHTML для создания окон с HTML-форматированием. Объект uiwebDocumentview создает вокруг UITextView мир, подобный обозревателю, и добавляет множество простейших процедур, которые имеются в обозревателе Интернета: удаленная выборка страниц, прямая и обратная навигация, а также изменение масштаба. Один из основных и лучших компонентов, который заставляет работать Safari, uiwebDocumentview, может использоваться и в ваших приложениях. Web-виды (web views) могут отображать не только HTML-страницы, они также могут отображать PDF-файлы (локальные и удаленные), графические изображения и любые другие типы файлов, поддерживаемые Safari.

Шон Хебер (Sean Heber of iApp-a-Day) написал функциональную обертку для класса UiwebDocumentview, названную SimpleWebView. Далее вы увидите, как работает его класс и те усовершенствования, которые мы внесли в него.

Создание Web-вида

Функциональный Web-вид состоит из трех компонентов:

? объект uiwebDocumentview выполняет все выборки, масштабирование и обработку ссылок для данного вида;

?   объект uiscroller требуется для прокрутки Web-вида, особенно при увеличении его масштаба;

?   объект NSURLRequest предоставлен в качестве класса, указывающего на ресурс, который необходимо выбрать.

Класс Шона simpleWebview инкапсулирует все эти объекты в управляющий класс на основе uiview: @interface SimpleWebview : UlView { UIWebDocumentView *webView; UlScroller *scroller; NSURLRequest *urlRequest;

}

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

SimpleWebview подменяет метод initwithFrame базового класса. Кроме того, он добавляет новый метод loadURL, который используется для загрузки Web- страницы или файлового ресурса. Когда инициализируется оберточный класс Шона, создаются объекты UIWebDocumentView и uiscroller. Затем загружается Web-вид как уровень для класса прокрутки.

Как работают прокрутки

Рассматривайте прокрутки (scrollers) как дешифрующий элемент. Поместив этот маленький элемент из пластика на какую-либо часть секретной шифровальной книги, вы откроете небольшую часть соответствующей страницы. Остальная часть этой страницы остается на том же месте, однако вы не сможете ее прочесть, пока не поместите на нее дешифрующий элемент. Такой элемент представляет собой экран iPhone, являющийся окном и единственным содержимым, которое может видеть пользователь. Остальная часть Web-страницы скрыта из поля зрения за пределами экрана до тех пор, пока пользователь не переместит окно к той части, которую он хочет увидеть. Создание прокрутки подобно созданию не только дешифрующего элемента, но и пустых страниц в секретной шифровальной книге. Web-вид— это содержимое, которое приклеивается к страницам для создания окна с прокручиваемым содержимым: scroller = [ [ UlScroller alloc ] initwithFrame: frame ]; [ scroller setScrollingEnabled: YES ];

[ scroller setAdjustForContentSizeChange: YES ]; [.scroller setClipsSubviews: YES ]; [ scroller setAllowsRubberBanding: YES ]; [ scroller setDelegate: self ]; [ self addSubview: scroller ];

Класс uiScroller может настраиваться множеством способов. Наиболее распространенными являются следующие параметры:

?   setScrollingEnabled: (BOOL) — включает панели прокрутки, разрешая прокрутке выполнять свою работу;

?   setAdjustForContentSizeChange: (BOOL) — автоматически перепрограммирует собственную панель прокрутки всякий раз, когда меняются границы содержимого;

?   setClipsSubviews: (bool) — указывает прокрутке не обрезать никакие данные, которые будут в ней содержаться;

?   setAllowsRubberBanding: (BOOL) — позволяет пользователю при достижении границы прокручиваемой области перетаскивать несколько дальше верхней и нижней границ. Когда пользователь поднимает свой палец, эта область отскакивает обратно на свое место подобно резиновой ленте, подавая тем самым визуальный сигнал о том, что пользователь достиг начала или конца документа;

?   setAllowsFourWayRubberBanding: (BOOL) — как И предыдущий параметр, данный метод— метод резиновой ленты. По умолчанию только верхняя и нижняя границы страницы имеют эффект подобной резиновой ленты. Чтобы разрешить прокрутке применять эффект резиновой ленты ко всем четырем сторонам, задайте этот метод в дополнение к предыдущему;

?   setBottomBufferHeight: (float) — данный метод буферизует содержимое таким образом, чтобы какая-либо определенная его часть была скрыта от конца прокручиваемой области. Воспользуйтесь этим, если у вашего содержимого большой буфер, например, завышенный серый фрейм или другая граница, которую вы бы хотели обрезать с экрана;

?   setContentSize: (CGSize) — данный метод может использоваться для определения размера страниц содержимого, которые будут сцеплены с прокруткой. В классе simplewebview этот метод* вызывается всякий раз, когда происходит изменение размеров изображения.

После того как вы создадите прокрутку, создайте объект uiWebDocumentvie и добавьте его как подвид прокрутки. Тем самым будет склеено содержимое Web-вида и прокрутка, что даст прокрутке управление видимой областью Web-страницы:

webView = ( [ UIWebDocumentView alloc ] initwithFrame: [ scroller bounds ] ]; [ webView setTilingEnabled: YES ]; [ webView setTileSize: frame.size j; [ webView setAutoresizes: YES]; [ webView setDelegate: self]; [ webView setEnabledGestures: OxFF ]; [ webView setSmoothsFonts: YES ]; [scroller addSubview: webView];

В Web-виде устанавливаются следующие параметры:

?   setTilingEnabled, setTileSize. UITiledView— ЭТО ВИД особого рода, используемый Google Maps, Safari и другими специализированными приложениями. Мозаичный вид разработан для загрузки содержимого в сетку, позволяющую отображать содержимое, даже если его загрузка еще не завершилась. Поскольку мозаичное размещение требуется Web-видами, то класс UIWebDocumentView без него работает некорректно, и не будет отображать какое-либо содержимое;

?   setAutoresize — указывает Web-виду автоматически изменять свой размер при загрузке или изменении масштаба страницы;

?   setEnabledGestures — разрешив сжатие и растяжение, с Web-видом можно обращаться так же, как и со страницей Safari. Затем можно подменить различные методы uiResponder, как описано в главе -/. для получения уведомлений об этих жестах;

?   setSmoothFonts — указывает Web-виду сглаживать шрифты загружаемого содержимого.

Итак, Web-вид создан и добавлен к прокрутке. Пришло время вызывать метод loadURL и загрузить какой-либо ресурс. URL-запрос делается для того, чтобы загрузить содержимое в Web-вид. Объект nsurl задает адрес для выполнения ‘загрузки. Этот объект может создаваться с помощью метода initWithString объекта nsurl: nsurl *url = [ [ nsurl alloc ]

initWithString: @"http://www.oreilly.com"

Внутри класса simpleWebView метод loadURL берет объект nsurl и создает NSURLRequest. Объект NSURLRequest похож на nsurl, однако инкапсулирует такую информацию, как коды состояния и отклика, которые необходимы для отслеживания момента загрузки Web-страницы. Данный запрос передается напрямую Web-виду: NSURLRequest *urlRequest = [

[ NSURLRequest requestWithURL: url ] retain

];

[ webView loadRequest: urlRequest ];

Настройка прокруток

Поскольку размер Web-страницы был неизвестен при создании прокручиваемого вида, вы должны подменить два метода в классе uiscroliview так, чтобы класс SimpleWebView получал уведомления, когда содержимое будет загружено и отображено. Этими методами являются didDrawinRect и didSetFrame. Всякий раз, когда обновляется прикрепленное к прокручиваемому классу содержимое, уведомляется метод didDrawinRect, разрешая ему пересчитать содержимое. Затем он настраивает его панели прокрутки в соответствии с размерами содержимого. В результате этого вызывается метод didSetFrame, который задает границы содержимого прокрутки.

-(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) {

CGSize size = [ webView bounds J.size;

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

lastSize = size;

[ scroller setContentSize: size ];

)

Для отслеживания последнего переданного размера документа в приведенном примере в классе simpleWebview используется структура CGSize под названием last size. Всякий раз, когда пользователь изменяет масштаб документа или же щелкает по ссылке, меняется размер документа. При этом для перенастройки панелей прокрутки должен вызываться метод setcontentsize прокрутки.

Автоматическое сглаживание при изменении размеров

Одно из усовершенствований, которое было сделано в этом классе, — это возможность автоматически сглаживать изображение при изменении его масштаба. Для этого вам необходимо наследовать класс UIWebDocumentView для перехвата уведомлений, отправляемых при жестах или двойных касаниях:

@interface MyWebView : UIWebDocumentView

{

}

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

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

@end

Затем эти два метода уведомляют делегата класса, который является объектом simpleWebview, чтобы он мог еще раз обновить панели прокрутки:

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

{

[ super gestureEnded: event ]; t _delegate gestureEnded: event ];

}

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

{

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

}

При изменении масштаба страницы имеющаяся на ней графика становится расплывчатой, если ее не сгладить. Для этого объект SimpleWebview вызывает метод redrawScaledDocument. Этот метод принадлежит классу uiwebDocumentview и сглаживает при необходимости графику и шрифты страницы:

- (void)gestureEnded: (struct______ GSEvent *)event {

[ webView redrawScaledDocument ] ; [ webView setNeedsDisplay ] ;

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

t

Когда страница перерисовывается при масштабировании, gestureEnded вызывает метод setNeedsUpdate Web-вида, который удостоверяет, что все изменения распространяются и вне экрана. Размер содержимого также должен быть пересчитан, поскольку масштаб содержимого был изменен, а также на прокрутку должен быть вызван setContentSize для обновления панелей прокрутки. Эту задачу должны выполнять обе ваши функции: gestureEnded И doubleTap.

Использование класса SimpleWebView

К счастью, класс SimpleWebView гораздо легче использовать, чем понять. Чтобы создать экземпляр класса SimpleWebView, содержащий все эти части, основной вид вызывает метод initwithFrame класса, с последующим вызовом loadURL:

NSURL *url = [ [ NSURL alloc ]

initWithString: @"http://www.oreilly.com"

] ;

SimpleWebView *webView = [ [ SimpleWebView alloc ]

initwithFrame: rect ]; [ webView loadURL: url ];

Чтобы загрузить локальный файл, например, PDF, используйте URI file://:

NSURL *url = [ [ NSURL alloc ]

initWithString: @" file:///var/root/Media/PDFs/Resume.PDF" ];

После создания объекта SimpleWebView он может быть добавлен к основному виду как подвид или перемещен как его собственный вид:

[ self addSubview: webView ];

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

По теме:

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