I have a webview which fills the full screen of the app. The content gets loaded from a web url, and is displayed correctly.
The problem is when I load it in portrait mode and then rotate to landscape, the right side can not receive any touch events. For example, the portrait screen width is 320, when I rotate to landscape which is 480, the right area (width 480-320=160) does not respond to touch.
The content is always displayed correctly, it fills the whole width, just the touch events don't work.
If I load it in landscape and then rotate to portrait, it works correctly.
A similar problem was reported on Apple's developer forum here
You should basically add
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
}
to the UIWebView's viewcontroller
Related
I have created an iAd frame right on top of the tab bar and I am using setAutoresizingMask to keep it in the right place when rotating the screen. Here is my code in viewDidLoad:
iAd = [[ADBannerView alloc] init];
bannerIsVisible=NO;
iAd.delegate=self;
[iAd setAutoresizingMask: UIViewAutoresizingFlexibleTopMargin
| UIViewAutoresizingFlexibleWidth];
// set iAd frame
iAd.frame = CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, 50);
[self.view addSubview:iAd];
This will create the banner just below the screen, so it will appear when the ad is loaded using the bannerViewDidLoadAd: delegate method and going back using the didFailToReceiveAdWithError method.
This works perfectly on iOS 6 and iOS7.
On iOS8 the banner appears in the right place when portrait, but when I rotate the screen to landscape, the banner appears around 10 points over the right place. Is like it doesn't take into consideration that the height of the frame is smaller when landscape.
Did something change in iOS8 about setAutoresizingMask?
Thanks
I have a view controller and separate nib files for portrait and landscape. On rotating, I load the respective nib. The methods
shouldAutorotateToInterfaceOrientation and willRotateToInterfaceOrientation
get called and the nib does change.
The problem:
the landscape nib does not appear as landscape, but portrait! The status bar is
correctly rotated and appears on the top:
(Sorry, couldn't paste the image, because my account is new. The screenshot is in
landscape, with a landscape status bar, but a landscape view shown as portrait.)
One would think the problem lies in not setting the orientation as Landscape in IB Simulated metrics for the view, but I've done that and the view appears as landscape in IB. (I don't think it would even be possible to create a rotated button like that if the view was portrait.) Besides these two nibs I have a mainwindow.xib, which contains the app delegate, window and view controller objects.
EDIT: I realized that the views are actually rotating, when they should "stay up". It's like there's an extra transformation. When I rotate the phone 90° right, the landscape xib is displayed rotated 90° right. When I rotate the phone another 90° right, the portrait xib is displayed upside down. The status bar is always correctly displayed at the top.
EDIT2: Using
self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));
in willRotateToInterfaceOrientation I can rotate the view to landscape left (and to any orientation I want), so I can use that as a workaround. However, I have other projects, where the view rotates automatically and doesn't require the use of CGAffineTransformMakeRotation. It's like something is preventing the automatic rotation here.
Are you adding the view loaded from nib as subView? If Only the status bar is rotating it means your previous view is hung while releasing the view and adding the new view.Can you tell how are you adding the view loaded from xib to the SuperView.
Make sure you are releasing the previous view correctly while loading the other view,put NSLOG in dealloc of the views and check whether the view is getting released completely.
I had done something similar to this only instead of making an nib file separately I just added two subviews to the main nib as prtraitView and Landscape View
and switched them as follows
In viewDidAppear method
-(void)viewDidAppear:(BOOL)animated{
if(UIDeviceOrientationIsPortrait(self.interfaceOrientation))
{
self.portraitVIew.frame=self.view.bounds;
self.portraitVIew.frame=self.view.frame;
[self.view addSubview:self.portraitVIew];
}else{
self.landscapeView.frame=self.view.frame;
[self.view addSubview:self.landscapeView];
}
self.view.autoresizesSubviews = YES;
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:#selector(deviceOrientationDidChangeNotification:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
and then Implemented deviceOrientationDidChangeNotification as follows
- (void)deviceOrientationDidChangeNotification:(NSNotification*)note
{
if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad) {
}else{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if(UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
self.landscapeView.hidden=NO;
self.landscapeView.frame=self.view.frame;
[self.portraitVIew removeFromSuperview];
[self.view addSubview:self.landscapeView];
}else {
self.landscapeView.hidden=YES;
self.portraitVIew.frame=self.view.frame;
NSLog(#"Portrait");
[self.view addSubview:self.portraitVIew];
}
}
}
It worked very well for me..
I'm trying to put a ad on top of my iPad app. I have the y corder net as zero. It seems like the first time the add is drawn it is drawn with the y cordernt starting at the very top. So the bar with the battery power and internet strength gets drawn onto. If you clcim on the add, and then return to the app the add is dawn right under the battery stregth bar with the y cordet still zero.
If i set the y to 60, it will look good at first, but then when you click on the add bar and then return to the add, the add is drawn 60 pixels below the battery bar instead of right under neath it.
It seems like sometimes the y starts at the very top of the screen, then it starts right below the battery stretch bar.
There must be a way to fix this,......
code
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
// AddCode
adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView.requiredContentSizeIdentifiers = [NSSet setWithObject:ADBannerContentSizeIdentifierPortrait];
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
[self.view addSubview:adView];
adView.delegate=self;
bannerIsVisible=NO;
}
// i removes all the code to make sure nothing was messing it up
#end
I suspect, if you play with it some you will find the issue is with the app launching in orientations other than portrait (either landscape or upside down).
I had a very similar problem and was able to get it working by fiddling with the wantsFullScreenLayout property on my UIViewController subclasses. The documentation of this property seems to imply that the correct value is NO, but try setting it to YES on your main view controller.
The scrollview is changing its position automatically when I switch to landscape and portrait modes more than one time while scrolling the scrollview.
What else I have to do...to retain its position in the same manner as it was loaded for the first time. I would like to scroll horizontally all the time in landscape mode and always vertical in portrait mode.
The below code is just I'm using:
UIScrollView * myBookScrollView = [[MyBooksScrollView alloc] init];
myBookScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
myBookScrollView.clipsToBounds = YES;
myBookScrollView.scrollEnabled = YES;
[self.view addSubview:myBookScrollView];
Did you try to set it's autoresizingMask? Setting it to UIViewAutoresizingFlexibleWidth might help.
I have created a subview which is used as a HUD in an iOS app. The app supports portrait and landscape display orientations.
The subview appears in portrait mode sometimes even if the mode is landscape. The subview is added by these lines:
self.infoHUDViewController = [[[InfoHUDViewController alloc] initWithNibName:#"InfoHUD" bundle:nil] autorelease];
[self.view addSubview:self.infoHUDViewController.view];
So it works very well if the subview is added in the viewDidLoad method. However, it does not work in landscape mode if the view is added in an IBAction method which responds to a button press. The subview appears as if in portrait mode (it appears 90° rotated, fills only the half screen width, and extends beyond the screen bounds).
What is really odd: In the init method of the subview's view controller the display orientation is correctly set to landscape. Am I missing something here?
I found a fix for this problem.
I added
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
} else {
self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
}
to the viewDidLoad method. Now everything works as excepted in all situations.