有大量的UIView居中问题和答案,但我没有找到符合我标准的问题和答案。 我有一个UIImageView子类,它是另一个(相同的(UIImageView子类的子视图。 我需要能够"重置"我的 UIImageView 子类,以便在用户交互时它在屏幕(根视图控制器的视图(中居中。
只是这样做:
- (void)reset {
[self setCenter: self.superview.center];
}
。不起作用,因为中心点位于超级视图的坐标系中,而不是根视图。 可以将超级视图拖动到远离根视图中心的位置。
最初,我遍历超级视图层次结构以查找根视图,但这仍然不起作用,同样是因为用户可以将不同的坐标系和各种比例应用于嵌套视图的每个级别的每个 UIImageView 子类。
我没有找到关于SO的完整解决方案,所以我写了自己的并发布在这里。希望它能为其他人节省一些时间和洞穴探险。
要在"屏幕"中居中 UIView,您需要相对于根视图控制器的视图将其居中。 如果您正在以编程方式子类化 UIView 或其子类(例如 ImageView(,并且您的超级视图不是视图控制器的视图,这将非常有用。 下面是一种在根视图中居中视图的方法,无论视图位于视图层次结构中的哪个位置:
// center the view in the root view
- (void)centerInRootview:UIView *view {
UIView *rootview = UIApplication.sharedApplication.keyWindow.rootViewController.view;
// if the view hierarchy has not been loaded yet, size will be zero
if (rootview.bounds.size.width > 0 &&
rootview.bounds.size.height > 0) {
CGPoint rootCenter = CGPointMake(CGRectGetMidX(rootview.bounds),
CGRectGetMidY(rootview.bounds));
// center the view relative to it's superview coordinates
CGPoint center = [rootview convertPoint:rootCenter toView:view.superview];
[view setCenter:center];
}
}
这将使用UIView.convertPoint:toView
方法从根视图的坐标系转换为视图超级视图的坐标系。
我在UIView
类别中使用此方法,以便可以从任何UIView
子类中使用它。 这是View.h
:
//
// View.h - Category interface for UIView
//
#import <UIKit/UIKit.h>
@interface UIView (View)
- (void)centerInRootview;
@end
和视图:
//
// View.m - Category implementation for UIView
//
#import "View.h"
@implementation UIView (View)
// center the view in the root view
- (void)centerInRootview {
// make sure the view hierarchy has been loaded first
if (self.rootview.bounds.size.width > 0 &&
self.rootview.bounds.size.height > 0) {
CGPoint rootCenter = CGPointMake(CGRectGetMidX(self.rootview.bounds),
CGRectGetMidY(self.rootview.bounds));
// center the view in it's superview coordinates
CGPoint center = [self.rootview convertPoint:rootCenter toView:self.superview];
[self setCenter:center];
}
}
@end
下面是一个简单的例子,说明如何从 UIImageView 子类中使用它。 ImageView.h:
//
// ImageView.h - Example UIImageView subclass
//
#import <UIKit/UIKit.h>
@interface ImageView : UIImageView
- (void)reset;
@end
和ImageView.m:
#import "ImageView.h"
@implementation ImageView
- (void)reset {
self.transform = CGAffineTransformIdentity;
// inherited from UIImageView->UIView (View)
[self centerInRootview];
}
@end