Чтобы отцентрировать 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:
//
// 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