我在肖像模式下有一个UIView作为XIB.
此视图以编程方式添加到viewcontroller,如下所示:
NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"InputView" owner:self options:nil];
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
Run Code Online (Sandbox Code Playgroud)
此视图具有正确设置的自动调整遮罩,并且在方向从纵向更改为横向时旋转正常.
但是,如果方向已经是横向,并且我在方向更改后创建视图,则它具有其初始纵向方向.
有没有办法告诉视图使用其掩码初始化或自己调整为肖像?
在此先感谢您的回复!
编辑:使用occulus和Inder Kumar Rathore的建议(谢谢你们!),我将代码改为:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
[self.view setNeedsLayout];
[self.view layoutSubviews];
[self.view layoutIfNeeded];
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
[self shouldAutorotateToInterfaceOrientation:orientation];
Run Code Online (Sandbox Code Playgroud)
不幸的是,根本没有变化.我想我发现有人问同样的问题:
答案正确地确定了问题,但并不是非常令人鼓舞......当然,我可以创建两个笔尖或调整框架大小,但这似乎与自动调整大小的想法相反.我觉得很难相信在唤醒之后无法告诉笔尖并将其添加到视图中以使用其自动调整功能......当设备旋转时它会完美无瑕.
编辑2:
idz的解决方案有效:
InputView *inputView = (InputView*)[nibObjects objectAtIndex:0];
[self.view addSubview:inputView];
inputView.frame = self.view.bounds;
[inputView show];
Run Code Online (Sandbox Code Playgroud)
谢谢!
无论屏幕大小和方向如何,这些布局系统都可帮助您调整大小.
如果我有自动调整大小掩码(弹簧和支柱)就像简单的解决方案,为什么我应该使用自动布局(约束)?
我在旧项目的VC中获得了以下代码(没有故事板,纯代码):
- (void)viewDidLoad {
[super viewDidLoad];
self.mapView = [[MKMapView alloc] initWithFrame:CGRectInset(self.view.frame, 10, 10) ];
[self.view addSubview:self.mapView];
self.view.backgroundColor = [UIColor redColor];
self.mapView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.view.translatesAutoresizingMaskIntoConstraints = NO; // <--- this line
}
Run Code Online (Sandbox Code Playgroud)
如果我评论最后一行,从纵向到横向或其他方式的旋转在ios8下约为3秒 !! 此外,偶尔在随机时间无法分配渲染缓冲区存储!出现错误.
如果我不评论它,它几乎是瞬间的(0.7秒).它似乎只与mapviews相关,其他视图/ VC旋转得很好.
在ios7下,无论如何在该行评论或不评论时旋转都很快.
为什么?为什么只有mapview受到影响?
编辑:似乎很明显autoresizingmask是错误的.如果在viewDidLoad我将其值设置为none并手动更改willRotate中的帧,则它可以快速工作.
当用户打电话时启动我的应用程序时,整个应用程序会在绿色的“电话”栏下方被下推。我的应用程序的根是a UITabViewController,并且选项卡现在部分出现在屏幕下方。最糟糕的是,结束通话后,视图现在占据了整个屏幕空间,但是选项卡栏仍部分位于屏幕下方!更奇怪的是,当启动应用程序并且用户接听电话或离开该应用程序时,在通话处于活动状态时拨打电话并返回到该应用程序时,它会按预期调整大小。(因此,只有在通话进行中从头启动应用程序时才会发生这种情况)
我只能看到的与此相关的帖子是通话状态栏如何影响UIViewController的视图大小?
答案之一是建议更改“自动调整大小”蒙版:
public override func viewDidLoad() {
super.viewDidLoad()
self.view.autoresizingMask = .flexibleHeight
}
Run Code Online (Sandbox Code Playgroud)
在我的UITabBarController,但它什么都没有改变。
另一个答案建议设定wantsFullScreenLayout到false,这是默认规则UIViewControllers,但不适合UITabBarControllers。但是,此属性在iOS 7中已弃用,建议使用edgesForExtendedLayout和extendedLayoutIncludesOpaqueBars代替。
我在那里找不到足够的信息来了解我应该如何解决此问题。有没有人有一个想法?
注意:对于某些图像,这将是非常说明性的,但是由于这些图像尚未发布,因此我无法发布
我有一个我最初为尺寸为320x480的iPhone应用程序创建的笔尖,并设置了自动调整遮罩,以便在其超级视图很大时向各个方向展开视图.
我现在正在使我的应用程序通用,并且使用相同的笔尖并在iPad的页面表格中显示它.
我的问题是我根据帧大小进行了一些计算,它仍然显示为320x480.但在其他方法中,框架大小正确显示为页面大小.
问题:自动调整遮罩何时生效,以便我可以在正确的时间进行计算?
什么时候可以知道UIViewController视图的确切大小?
我有一个多行,UILabel其帧取决于其文本和父视图的宽度.考虑到我需要放置其他视图下面的UILabel,它做它的框架盖文的准确的空间是很重要的.
我目前正在计算这样的大小viewDidLoad:
labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(self.view.frame.size.width, MAX_HEIGHT)];
Run Code Online (Sandbox Code Playgroud)
问题是当父视图UIViewController用作模态表单或弹出框时,父视图的宽度会发生变化.如果我使用autoresizingMaskUILabel的框架进行相应的调整,但它不再适合文本.
UILabel知道UIViewController's视图的确切大小,我在哪里可以计算出这个框架?
这是在显示UIViewController模态表单(UIModalPresentationFormSheet)时打印self.view.frame的结果.
viewDidLoad: (0.000000;0.000000;320.000000;480.000000)
viewWillAppear: (0.000000;0.000000;768.000000;960.000000)
afterDelay: (0.000000;0.000000;540.000000;576.000000)
Run Code Online (Sandbox Code Playgroud)
产生上述输出的代码:
- (void)viewDidLoad {
[super viewDidLoad];
[Utils logFrame:self.view.frame tag:@"viewDidLoad"];
}
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[Utils logFrame:self.view.frame tag:@"viewWillAppear"];
[self performSelector:@selector(afterDelay) withObject:nil afterDelay:0.1];
}
- (void) afterDelay {
[Utils logFrame:self.view.frame tag:@"afterDelay"];
}
Run Code Online (Sandbox Code Playgroud) 我发现了很多关于自动调整的信息,但没有一个能够解决我的问题.我有一个ViewController(RAViewController),它在loadView方法中调用一个视图,如下所示:
- (void)loadView
{
// Set Navigation Bar Title
self.navigationItem.title = @"RA";
// Add Background view
self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Add RAView
RAView *rAView = [[RAView alloc] initWithFrame:self.view.frame Controller:self];
[self.view rAView];
}
Run Code Online (Sandbox Code Playgroud)
它调用的视图(RAView)如下所示:
- (id)initWithFrame:(CGRect)frame Controller:(RAViewController *)Controller
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.autoresizesSubviews = YES;
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.backgroundColor = [[UIColor alloc] initWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
controller = Controller;
// Draw Architecture View
[self drawArchitectureView];
}
return self; …Run Code Online (Sandbox Code Playgroud) 我一直遇到设计视图的问题,以便子视图在使用自动调整掩码时的行为方式(例如,如果状态栏大小发生变化,将手机用作热点等).有什么好的文件我一定要读的吗?苹果文件似乎对我没有帮助,至少没有对我自己进行过一些严峻的测试.
非常简单的问题,但我问,因为似乎有很多相互矛盾的观点,我一直无法找到明确的答案,更不用说现代的答案了.
我使用自动布局将99%的用户操作从纵向更改为横向,反之亦然UIViewController.效果很好.但有时候,由于某种原因,我不得不依赖帧.
我怎么能最好地处理这个?
你有willAnimateRotationToInterfaceOrientation,检查状态栏willRotateToInterfaceOrientation的NSNotification方法,我相信还有其他一些.
如果我想在用户旋转时更改视图的位置,我应该在哪个方法中更改框架?最好是用简单的方法来做,setFrame:还是应该使用自动修复蒙版?
objective-c uiviewcontroller ios autoresizingmask autolayout
我想在滚动视图底部对齐红色图像。在纵向方向上,它看起来很好,因为滚动视图的高度等于视图高度。
但在横向模式下,它看起来像这样,在横向模式下,我希望它完全隐藏,直到用户滚动到滚动视图的底部,以便红色图像始终位于滚动视图的底部。目前,它在横向模式下看起来像这样。

我已添加红色图像作为滚动视图的子视图,并对其应用了bottommarginautoresizingmask。
autoresizingmask ×10
ios ×8
iphone ×4
objective-c ×4
autolayout ×2
ipad ×2
addsubview ×1
cocoa-touch ×1
constraints ×1
ios7 ×1
ios8 ×1
mkmapview ×1
orientation ×1
uiscrollview ×1
uistatusbar ×1
uiview ×1
viewdidload ×1