Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS 7视图未调整大小或隐藏_Objective C_Uiviewcontroller_Uiwebview_Ios7_Uinavigationcontroller - Fatal编程技术网

Objective c iOS 7视图未调整大小或隐藏

Objective c iOS 7视图未调整大小或隐藏,objective-c,uiviewcontroller,uiwebview,ios7,uinavigationcontroller,Objective C,Uiviewcontroller,Uiwebview,Ios7,Uinavigationcontroller,我有一个问题,几个星期来我一直在想这个问题。请帮忙。我有一个iOS 7应用程序,它具有导航栏视图、嵌入文本字段的视图(addressBarView)和web视图。我正在实现WebScriptObject(我不关心iTunes存储的可通过性),这样网页JavaScript就可以启动Objective C方法。这非常有效,直到我启动了一个应该隐藏导航栏和地址栏的方法 这里是风景 …这是子视图的结构和弹簧 加载网页时,会检查META标记。如果他们说或,那么下面的showHideNavBar或s

我有一个问题,几个星期来我一直在想这个问题。请帮忙。我有一个iOS 7应用程序,它具有导航栏视图、嵌入文本字段的视图(addressBarView)和web视图。我正在实现WebScriptObject(我不关心iTunes存储的可通过性),这样网页JavaScript就可以启动Objective C方法。这非常有效,直到我启动了一个应该隐藏导航栏和地址栏的方法

这里是风景

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

加载网页时,会检查
META
标记。如果他们说
,那么下面的
showHideNavBar
showHideNavBar
方法将被触发。这些很好用

现在,这里有什么是不需要的

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

#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)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];
    });
}

这是正常状态

当导航栏和地址栏隐藏在网页加载上时,使用META-tag指令隐藏这些栏

现在,当栏被隐藏,我离开页面并返回时,我得到了这个

我把这个屏幕截图拉下来,你可以看到地址栏隐藏在导航栏后面

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


我已经尝试了很多模式来让它起作用。我尝试过不使用dispatch_async(崩溃应用程序)、使用LayoutFneed、LayoutSubview等。有人有解决方案吗?

你知道,一个角色可以决定你的心智是否健全。启动显示/隐藏操作的方法是类方法,
webScriptNameForSelector
。我必须为需要操作的UI元素创建实例变量

- (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];
    });
}