我正在为iPad编写需要自定义布局的iOS应用程序。
纵向和横向的布局完全不同,因此使用UIAutoResizingMask无法解决。
我尝试使用layoutSubview方法,但我检测到布局子视图被调用很多(来自UIScrollView)。 如何减少layoutSubview调用以优化代码,或者我应该在旋转设备时自己调用它。
感谢。
答案 0 :(得分:4)
对于不同的横向和纵向设计,请使用视图控制器方法,例如
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
如果您根据当前方向创建自定义视图,请通过UIDeviceOrientationDidChangeNotification
通知检查此方向并编写相应的代码。
在其中一个init~
方法中:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangedOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil];
行动
- (void) didChangedOrientation:(NSNotification *)sender{
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (UIDeviceOrientationIsPortrait(orientation)){}}
答案 1 :(得分:3)
孩子 layoutSubviews
调用UIScrollView
的事实非常不幸,但有一个(丑陋的)解决方法:
@interface MyClass : UIView {
BOOL reallyNeedsLayout_;
}
@end
@implementation MyClass
- (void)setNeedsLayout
{
[super setNeedLayout];
reallyNeedsLayout_ = YES;
}
- (void)setFrame:(CGRect)rect
{
[super setFrame:rect];
reallyNeedsLayout_ = YES;
}
- (void)layoutSubviews
{
if (!reallyNeedsLayout_) return;
reallyNeedsLayout_ = NO;
// Do layouting.
}
@end
不是最好的解决方案,但似乎运作得相当好。
答案 2 :(得分:1)
你不应该在layoutSubviews中进行昂贵的计算:
答案 3 :(得分:0)
根据经验,我个人只会根据deviceDidRotateSelector通知调整您的布局。 我有一个updatePortrait方法和updateLandscape方法,并调用任何必要的。