Как определить высоту UIWebView на основе содержания в переменной высоте UITableView?

Поскольку Субъект излучает до подписки printFoo.

После подписки больше нет Тематических излучений.

Вместо этого вы можете использовать BehaviorSubject, поскольку он содержит излучаемые значения (последнее излученное значение):

const unsubscribe = new BehaviorSubject(false);

function printFoo() {
  of('foo')
    .pipe(takeUntil(unsubscribe.pipe(filter(value => !!value)))) // Don't unsub if it's false emitted
    .subscribe(console.log)
}
function onDestroy() {
  unsubscribe2.next(true); // Emit true to cancel subscription
}
69
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

Этот код, вероятно, слишком медленный для использования табличного представления, но делает свое дело. Не похоже, что есть какая-то альтернатива, поскольку UIWebView не предлагает прямого доступа к DOM.

В viewDidLoad контроллера представления я загружаю некоторый HTML-код в веб-представление, и когда загрузка заканчивается, запускаю некоторый JavaScript чтобы возвратить высоту элемента.

- (void)viewDidLoad
{
    [super viewDidLoad];
    webview.delegate = self;
    [webview loadHTMLString:@"<div id='foo' style='background: red'>The quick brown fox jumped over the lazy dog.</div>" baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"];
    NSLog(@"height: %@", output);
}
77
ответ дан duncanwilcox 24 November 2019 в 13:50
поделиться

Я был очень рад найти ваши ответы, у меня хорошо сработал трюк с javascript.

Однако я хотел сказать, что существует также метод sizeThatFits:

CGSize goodSize = [webView sizeThatFits:CGSizeMake(anyWidth,anyHeigth)];

Мы должны установить предпочтительный размер, отличный от нуля, но в остальном он обычно всегда работает!

Обычно, потому что с UIWebViews, кажется, работает только при второй загрузке (я использую метод loadHTMLString: и да, я вызываю sizeThatFits: из делегированного метода didFinishLoad:).

Вот почему я был очень рад найти ваше решение, которое работает в любом случае.

28
ответ дан 24 November 2019 в 13:50
поделиться

Кажется, это работает. На данный момент.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    CGFloat webViewHeight = 0.0f;
    if (self.subviews.count > 0) {
        UIView *scrollerView = [self.subviews objectAtIndex:0];
        if (scrollerView.subviews.count > 0) {
            UIView *webDocView = scrollerView.subviews.lastObject;
            if ([webDocView isKindOfClass:[NSClassFromString(@"UIWebDocumentView") class]])
                webViewHeight = webDocView.frame.size.height;
        }
    }
}

Он должен безопасно вернуть 0 в случае сбоя.

6
ответ дан 24 November 2019 в 13:50
поделиться

Если у вас есть плохие значения с sizeThatFits в первый раз, но не после, вот возможная причина, с которой я столкнулся: ошибка с внешним CSS. Похоже, что webViewDidFinisLoad вызывается слишком рано, до того, как внешние CSS будут получены, а веб-документ полностью создан. Я думаю, что ошибка исчезает при перезагрузке из-за кэша.

Хитрость: предварительно загрузите свой CSS с помощью фиктивного UIWebView soon в вашем приложении.

SDK : IOS4

3
ответ дан 24 November 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: