【问题标题】:iOS 7 Views not resizing or hidingiOS 7 视图未调整大小或隐藏
【发布时间】:2014-01-22 15:51:18
【问题描述】:

我有一个问题已经困扰了好几个星期了。请帮忙。我有一个 iOS 7 应用程序,它具有导航栏视图、一个带有嵌入式文本字段 (addressBarView) 的视图和一个 Web 视图。我正在实现 WebScriptObject(我不关心 iTunes 商店的通行性),以便网页 JavaScript 可以触发 Objective C 方法。在我触发一个应该隐藏导航栏和地址栏的方法之前,这非常有效。

这里是视图...

...这是子视图的结构和弹簧...

当一个网页被加载时,META 标签会被检查。如果他们说<meta http-equiv="hidenavbar" content="true"><meta http-equiv="hideaddressbar" content="true">,那么下面的showHideNavBarshowHideNavBar 方法就会被触发。这些效果很好。

现在这不是

我不会对 WebScriptObject 的细节感到厌烦,但这里是相关的代码段。

#pragma mark - webScript Bridge

+ (NSString *)webScriptNameForSelector:(SEL)sel {
    // Naming rules can be found at:http://goo.gl/GAkziE
    if (sel == @selector(showHideAddressBar::)) {return @"showHideAddressBar";} else
    if (sel == @selector(showHideNavBar::)) {return @"showHideNavBar";}
}

因为所有 UI 更改都必须在主线程上完成,所以我这样做...

- (void)showHideNavBar:(BOOL)hide :(BOOL)animate {
    NSDictionary *navBarOptions = @{@"hide": [NSString stringWithFormat:@"%hhd", hide],
                                    @"animate": [NSString stringWithFormat:@"%hhd", animate]};
    [self performSelectorOnMainThread:@selector(navBarState:) withObject:navBarOptions waitUntilDone:NO];
}

.

- (void)showHideAddressBar:(BOOL)hide :(BOOL)animate {
    NSDictionary *adrBarOptions = @{@"hide": [NSString stringWithFormat:@"%hhd", hide],
                                   @"animate": [NSString stringWithFormat:@"%hhd", animate]};
    [self performSelectorOnMainThread:@selector(addressBarState:) withObject:adrBarOptions waitUntilDone:NO];
}

然后是真正时髦的东西。

- (void)navBarState:(NSDictionary *)navBarOptions {
    float addressBarY = navBarHidden ? 20.0f : 0.0f;
    BOOL animate = [navBarOptions[@"animate"] boolValue];
    BOOL hide = [navBarOptions[@"hide"] boolValue];
    float webViewY = addressBarY + (addressBarHidden ? 0.0f : 40.0f);
    float webViewHeight = [self view].frame.size.height - webViewY;

    self.navigationController.navigationBar.translucent = NO;
    if (hide && !navBarHidden) {
        navBarHidden = YES;
        [self.navigationController setNavigationBarHidden:YES animated:animate];
    }
    else if (!hide && navBarHidden) {
        navBarHidden = NO;
        [self.navigationController setNavigationBarHidden:NO animated:animate];
    }

    CGRect rectAddrBar = self.addressBarView.frame;
    rectAddrBar.origin.y = addressBarY;
    self.addressBarView.frame = rectAddrBar;

    CGRect rectWebView = self.webView.frame;
    rectWebView.origin.y = webViewY;
    rectWebView.size.height = webViewHeight;
    self.webView.frame = rectWebView;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.view layoutSubviews];
    });
}

.

- (void)addressBarState:(NSDictionary *)adrBarOptions {
    float addressBarY = navBarHidden ? 20.0f : 0.0f;
//    BOOL animate = [adrBarOptions[@"animate"] boolValue];
    BOOL hide = [adrBarOptions[@"hide"] boolValue];
    float webViewY = addressBarY + (addressBarHidden ? 0.0f : 40.0f);
    float webViewHeight = [self view].frame.size.height - webViewY;

    if (hide && addressBarHidden == NO) {
        addressBarHidden = YES;
        self.addressBarView.hidden = YES;
        self.urlTextField.hidden = YES;
        webViewY = addressBarY;
        webViewHeight = [self view].frame.size.height - webViewY;
    } else if (!hide && addressBarHidden == YES) {
        addressBarHidden = NO;
        self.addressBarView.hidden = NO;
        self.urlTextField.hidden = NO;
        webViewY = self.addressBarView.frame.size.height;
        webViewHeight = [self view].frame.size.height - webViewY;
    }
    CGRect rectAddrBar = self.addressBarView.frame;
    rectAddrBar.origin.y = addressBarY;
    self.addressBarView.frame = rectAddrBar;

    CGRect rectWebView = self.webView.frame;
    rectWebView.origin.y = webViewY;
    rectWebView.size.height = webViewHeight;
    self.webView.frame = rectWebView;

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.view layoutSubviews];
    });
}

这是正常状态。

此时导航栏和地址栏在网页加载时隐藏,使用 META 标签指令隐藏栏。

现在,当条形图被隐藏并且我离开页面并返回时,我得到了这个。

我在这个屏幕截图中拉下网页,以便您可以看到地址栏隐藏在导航栏后面

当我在视图更新点设置断点时,我看到正在使用主线程。

我已经尝试了很多模式来让它发挥作用。我试过不使用 dispatch_async(崩溃应用),使用 layoutIfNeeded、layoutSubviews 等。有人有解决方案吗?

【问题讨论】:

    标签: objective-c uiviewcontroller uiwebview ios7 uinavigationcontroller


    【解决方案1】:

    你知道,一个角色可以成就或破坏你的理智。启动显示/隐藏操作的方法webScriptNameForSelector 是一个类方法。我必须为需要操作的 UI 元素创建实例变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多