iOS and Objective-C: why does my UIWebView gets fullscreen when I click a link on it?

396 views Asked by At

At first, sorry for my bad English, I'm just learning it. Im relatively new at Objective-C and I'm using FBConnect bundle to link my app to Facebook. All it's working correctly, but when I click a link into the UIWebView (the Facebook login button, for example), my UIWebView gets fullscreen and hides my close button (a little 'x' button in the top right of the UIWebView, called here "_closeButton").

Here's the code:

The "init" method:

- (id)init {
  if ((self = [super initWithFrame:CGRectZero])) {
    _delegate = nil;
    _loadingURL = nil;
    _showingKeyboard = NO;

    self.backgroundColor = [UIColor clearColor];
    self.autoresizesSubviews = NO;
    //self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.contentMode = UIViewContentModeRedraw;

    _webView = [[UIWebView alloc] initWithFrame:CGRectMake(kPadding, kPadding, 480, 480)];
    _webView.delegate = self;
    //_webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self addSubview:_webView];



    //UIImage* closeImage = [UIImage imageNamed:@"FBDialog.bundle/images/close.png"];
    UIImage* closeImage = [UIImage imageNamed:@"close"];

    UIColor* color = [UIColor colorWithRed:255.0/255 green:/*184.0*/0.0/255 blue:/*216.0*/0.0/255 alpha:1];
    _closeButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
    [_closeButton setImage:closeImage forState:UIControlStateNormal];
    [_closeButton setTitleColor:color forState:UIControlStateNormal];
    [_closeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
    [_closeButton addTarget:self action:@selector(cancel)
           forControlEvents:UIControlEventTouchUpInside];

    // To be compatible with OS 2.x
#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_2_2
    _closeButton.font = [UIFont boldSystemFontOfSize:12];
#else
    _closeButton.titleLabel.font = [UIFont boldSystemFontOfSize:12];
#endif

    _closeButton.showsTouchWhenHighlighted = YES;
    _closeButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin
    | UIViewAutoresizingFlexibleBottomMargin;
    [self addSubview:_closeButton];
    NSLog(@"close");

    _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
                UIActivityIndicatorViewStyleWhiteLarge];
    _spinner.autoresizingMask =
    UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin
    | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    [self addSubview:_spinner];
    _modalBackgroundView = [[UIView alloc] init];
}
return self;
}

The delegate of the WebView (I suspect here's where I need to do the trick)

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType {
NSURL* url = request.URL;

if ([url.scheme isEqualToString:@"fbconnect"]) {
    if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) {
        NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="];
        NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="];
        if (errorCode) {
            NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"];
            NSError * error = [NSError errorWithDomain:@"facebookErrDomain"
                                                  code:[errorCode intValue]
                                              userInfo:errorData];
            [self dismissWithError:error animated:YES];
        } else {
            [self dialogDidCancel:url];
        }
    } else {
        [self dialogDidSucceed:url];
    }
    return NO;
} else if ([_loadingURL isEqual:url]) {
    return YES;
} else if (navigationType == UIWebViewNavigationTypeLinkClicked) {
    if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) {
        if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) {
            return NO;
        }
    }

    [[UIApplication sharedApplication] openURL:request.URL];
    return NO;
} else {
    return YES;
}
}

And the show method (called when I need to show the Web View)

- (void)show {
NSLog(@"Cuantas veces me ves?");
[self load];
[self sizeToFitOrientation:NO];

CGFloat innerWidth = self.frame.size.width - (kBorderWidth+1)*2;
[_closeButton sizeToFit];

_closeButton.frame = CGRectMake(
                                2,
                                2,
                                29,
                                29);

_webView.frame = CGRectMake(
                            kBorderWidth+1,
                            kBorderWidth+1,
                            innerWidth,
                            self.frame.size.height - (1 + kBorderWidth*2));

[_spinner sizeToFit];
[_spinner startAnimating];
_spinner.center = _webView.center;
UIWindow* window = [UIApplication sharedApplication].keyWindow;
if (!window) {
    window = [[UIApplication sharedApplication].windows objectAtIndex:0];
}

_modalBackgroundView.frame = window.frame;
[_modalBackgroundView addSubview:self];
[window addSubview:_modalBackgroundView];

[window addSubview:self];

[self dialogWillAppear];

self.transform = CGAffineTransformScale([self transformForOrientation], 0.001, 0.001);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:kTransitionDuration/1.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)];
self.transform = CGAffineTransformScale([self transformForOrientation], 1.1, 1.1);
[UIView commitAnimations];

[self addObservers];
}

Googling the problem, I found that this could be the Default behaviour of the UIWebView. How can I change it to make all my WebViews of the same size than the first one?

Thanks in advance!

== EDIT ==

Still don't know why is my UIWebView acting like this, or how to solve it, but since the code is part of the FBConnect Bundle, I suppose I shouldn't edit it too much. I just created programmatically a new close button on the top and that's all. But I'll let the question open if someone knows how to solve it. Thanks to Leo Natan for his help.

0

There are 0 answers