2010-03-20 2 views
21

Я хотел бы добавить заголовок в UIWebView, похожий на адрес/строку поиска в MobileSafari и отличный Articles.app by Sophia Teutschler. Точнее, я хотел бы создать представление «вытащить для фиксации» над UIWebView, как в статьях. В статьях используется UIWebView, поэтому это кажется возможным. Есть ли способ сделать это без необходимости встраивать UIWebView в UIScrollView и обновлять его размер все время, как описано в this article? По-видимому, мне нужны прокручивающие события, чтобы вести «ориентацию по фиксации», соответственно.Добавление представления заголовка в UIWebView, похожее на Safari и статьи

+5

Вы пробовали расспросить Софи? – hatfinch

+0

Вы пытались добавить subview в UIWebView? – benzado

ответ

11

После нескольких активности, которая я решил пойти с этим решением:

В основном я только добавил свой заголовок UIView как webview.scrollview подвид.

Чтобы избежать заголовка перекрывать вид браузера:

  • цикл через все [webview.scrollView подвиды]
  • взгляд на самый большой, которым должен содержит браузер (остальные для теней и линий)
  • изменить свою origin.y

    вот код:

    CGRect browserCanvas = web.bounds; 
    for(int i=0; i< [[web.scrollView subviews] count]; i++) 
    { 
        UIView* subview = [[web.scrollView subviews] objectAtIndex:i]; 
        CGRect f = subview.frame; 
        NSLog(@"sub %d -> x:%.0f, y:%.0f, w:%.0f, h:%.0f", i, f.origin.x, f.origin.y, f.size.width, f.size.height); 
    
        if(f.origin.x == browserCanvas.origin.x && 
        f.origin.y == browserCanvas.origin.y && 
        f.size.width == browserCanvas.size.width && 
        f.size.height == browserCanvas.size.height) 
        { 
         f.origin.y = header.frame.size.height; 
         subview.frame = f; 
        } 
    } 
    
    if(![header superview]) 
    { 
        [web.scrollView addSubview:header]; 
        [web.scrollView bringSubviewToFront:header]; 
    } 
    
+3

Как насчет использования содержимогоInsets scrollView (и установите, что ваш кадр y будет отрицательным)? –

+1

@kenji, который хорошо работает, как @Manesh подробнее в другом ответе. За исключением случая, когда ваш webView имеет элемент с положением css, установленным на 'fixed-top'. Если вы ожидаете широкого разнообразия веб-контента, вы столкнетесь с страницей с навигационной панелью с фиксированной точкой, поэтому предложение sosergio лучше всего работает. –

0

В статье не может быть использован UIWebView для отображения основного текста статьи. Для выполнения вашей задачи UIScrollView потребуется почти наверняка. Изменение размера его подзаголовков может не понадобиться. Проверьте образцы кода UIScrollView, предоставленные Apple.

+0

Статьи почти наверняка используют 'UIWebView'. – MrMage

0

Я не мог сказать точно, но Twitter, похоже, использует UITableView для достижения этого. Возможно, вы можете попытаться поместить свое представление в заголовок табличного представления и ваш контент в ячейке.

Вот интересный пример, который вы могли бы рассмотреть глядя на - How to make a Pull-To-Reload TableView just like Tweetie 2

+1

У меня нет никаких проблем с реализацией этого материала для любого типа 'UITableView', но мне нужно иметь его для' UIWebView'. – MrMage

+2

Я думаю, что Адам предлагал сделать tableView с отдельной пользовательской ячейкой, содержащей UIWebView с загруженным в нее веб-содержимым. – slycrel

0

Enormego опубликовал некоторые примеры код, чтобы сделать тянуть к обновлению вещь происходит:

https://github.com/enormego/EGOTableViewPullRefresh

Это действительно не так сложно , Вы можете получить панель заголовков Safari/Articles в стиле таблицы, просто создав свою панель заголовка и просто добавив ее в свой UITableView в качестве подзаголовка. Я делаю точно, что на приложение я работаю сейчас:

GBSpendingMeter *meterView = [[[GBSpendingMeter alloc] initWithFrame:CGRectMake(0,0,320,44)] autorelease]; 

// The meterView will appear pinned to the top of the table, similar to a headerView 
[self.tableView addSubview:meterView]; 

Хитрость наблюдает за событиями прокрутки на столе (FYI, UITableView является подклассом UIScrollView, так что все те же уведомления/обратные вызовы должен работать), но пример кода, к которому я привязан, имеет хороший пример того, как это работает.

+3

У меня нет никаких проблем с реализацией этого материала для любого типа 'UITableView', но мне нужно иметь его для' UIWebView'. – MrMage

7

Я думаю, что лучшим решением является добавление заголовка в виде подсмотра вашего scrollView вашего UIWebView, настройки UIEdgeInsets, а в функции делегата scrollViewDidScroll при необходимости настраивает scrollIndicatorInsets.

Каждое другое решение, которое я нашел, не учитывало индикаторы прокрутки.

Поскольку для получения правильного поведения у него есть немного сложности, я решил написать класс для обработки всего этого: MMWebViewWithSmartHeader. Это все еще немного грубо по краям, но должно помочь.

+0

большое спасибо! – HelloWorld

+0

+1, хотя я не смог получить работу с набором 'UIImageView' как headerView. Мне пришлось обернуть 'UIImageView' внутри' UIView'. – FreeAsInBeer

+0

Неплохо, но некрасиво, когда веб-просмотр увеличен или развернут на оси х. Заголовок должен блокироваться по оси x и не должен зависеть от масштабирования прокрутки. – Martin

0

Попробуйте это:

UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, -100, WIN_WIDTH, 100)]; 
    redView.backgroundColor = [UIColor redColor]; 
    self.view.scrollView.contentInset = UIEdgeInsetsMake(100, 0, 0, 0); 
    [self.view.scrollView addSubview:redView]; 
    NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:@"http://www.baidu.com"]]; 
    [self.view loadRequest:request]; 
3

Мне нравится AutoLayout специально, потому что я могу сделать высоту заголовка динамичными.

Это мой код с использованием AutoLayout в контроллере со ссылкой «headerView» в виде заголовка и «webView» в webView.

// Function called in ViewDidLoad: 
func addHeaderToWebView(){ 
    // We load the headerView from a Nib 
    headerView = NSBundle.mainBundle().loadNibNamed(WebViewHeader.nibName, owner: self, options: nil).first as! WebViewHeader 

    headerView.translatesAutoresizingMaskIntoConstraints = false 

    webView.scrollView.addSubview(headerView) 

    // the constraints 
    let topConstraint = NSLayoutConstraint(item: headerView, attribute: .Bottom, relatedBy: .Equal, toItem: webView.scrollView, attribute: .Top, multiplier: 1, constant: 0) 
    let leftConstraint = NSLayoutConstraint(item: headerView, attribute: .Leading, relatedBy: .Equal, toItem: webView, attribute: .Leading, multiplier: 1, constant: 0) 
    let rightConstraint = NSLayoutConstraint(item: headerView, attribute: .Trailing, relatedBy: .Equal, toItem: webView, attribute: .Trailing, multiplier: 1, constant: 0) 

    // we add the constraints 
    webView.scrollView.addConstraints([topConstraint]) 
    webView.addConstraints([leftConstraint, rightConstraint]) 
} 

// Function called in viewWillLayoutSubviews: to update the scrollview of the webView content inset 
func updateWebViewScrollViewContentInset(){ 
    webView.scrollView.contentInset = UIEdgeInsetsMake(headerView.frame.height, 0, 0, 0) 
} 
Смежные вопросы