我为4英寸iPhone 5 / 5c / 5s构建了一个完整的故事板应用程序(在xib文件中有大约50-60个视图控制器布局),我正在寻找一种缩小屏幕的方法。 / p>
缩小"缩小"我的意思是当程序在较小的iPhone上运行时,我会自动将我在故事板中布置的每个屏幕都按照方面进行缩放,例如iPhone 4S,4,3G或任何与iOS 7.1兼容的小型号。
我没有时间单独更改故事板上每个布局项目的配置,因为这相当于1000个对象,因此请限制您对更大规模的任何答案或建议。当然,必须存在一些库的方法,它允许我们将所有内容移动到较小的iPhone上的较小窗口中,而无需剪切或裁剪。即使缩小/缩小导致模糊或字体不太明显,这对于屏幕的整个部分变得离屏也是更可取的。
允许简单方面比例的全局设置,将storyPhoneWidth / iPhone5Width中的每个对象的每个维度乘以水平维度和destinationPhoneHeight / iPhone5Height将是一个令人满意的解决方案。我不知道存在一个......
答案 0 :(得分:0)
有一个解决方案可以实现您的目标,即AUTOLAYOUT
除此之外,我认为没有任何图书馆可以达到这样的目标,而且肯定会花费你很多时间,因为你提到50-60视图控制器。抱歉,您应该早点决定是否支持您的应用的大小。所以最好用它并保持编码。还有下一次,当从app开始时,请保持其兼容性,以避免最后的大量工作。
答案 1 :(得分:0)
几年前,我将iPad布局缩放到iPhone尺寸,没有自动布局。解决方案是将an affine transform应用于您的视图层次结构,如下所示:
containerView.transform = CGAffineTransformMakeScale(myScale, myScale);
以下是您必须考虑的一些细节。
UIWindow
也可能有效,我还没有对此进行测试。我在当前项目中使用此方法来调整不同设备的布局。我们的想法是在从nib加载后立即获取您的视图,并递归遍历它,将每个大小相乘。不仅是框架,还有字体大小,边框宽度等。
如果没有自动布局,您必须直接操作帧。使用自动布局,您必须采用每个约束并乘以其常量。
以下是使用自动布局解决此任务的类别。它会处理UILabel
,UITextField
,UITextView
,UIButton
中的字体大小,并且您必须使用其他所需的视图手动扩展它。此外,您还必须在自定义视图中覆盖-zoomCustomAttributesWithScale:
和-shouldMultiplySubviews:
。
@interface UIView (MultiplyLayout)
- (void)zoomLayoutWithScale:(CGFloat)scale;
- (BOOL)shouldMultiplySubviews;
- (void)zoomCustomAttributesWithScale:(CGFloat)scale;
@end
@implementation UIView (MultiplyLayout)
- (void)zoomLayoutWithScale:(CGFloat)scale {
CGRect oldFrame = self.frame;
CGRect newFrame = oldFrame;
newFrame.size.width *= scale;
newFrame.size.height *= scale;
for (NSLayoutConstraint *constraint in self.constraints)
constraint.constant *= scale;
if (self.shouldMultiplySubviews)
for (UIView *subview in self.subviews)
[subview zoomLayoutWithScale:scale];
[self zoomCustomAttributesWithScale:scale];
self.frame = newFrame;
}
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
}
- (BOOL)shouldMultiplySubviews {
return (self.class == [UIView class] ||
self.class == [UIScrollView class]);
}
@end
@interface UIFont (MultiplyLayout)
- (instancetype)zoomedWithScale:(CGFloat)scale;
@end
@implementation UIFont (MultiplyLayout)
- (instancetype)zoomedWithScale:(CGFloat)scale {
return [UIFont fontWithName:self.fontName size:self.pointSize * scale];
}
@end
@implementation UILabel (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UITextField (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UITextView (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.font = [self.font zoomedWithScale:scale];
}
@end
@implementation UIButton (MultiplyLayout)
- (void)zoomCustomAttributesWithScale:(CGFloat)scale {
self.titleLabel.font = [self.titleLabel.font zoomedWithScale:scale];
}
@end