Как программно центрировать подпредставление iOS UIView в корневом представлении? - PullRequest
0 голосов
/ 01 октября 2018

Есть тонны UIView центрирующих вопросов и ответов, но я не нашел тот, который соответствует моим критериям.У меня есть подкласс UIImageView, который является подвидом другого (того же) подкласса UIImageView.Мне нужно иметь возможность "сбросить" мой подкласс UIImageView так, чтобы при взаимодействии с пользователем он центрировался на экране (представление контроллера корневого представления).

Просто сделать это:

- (void)reset {
    [self setCenter: self.superview.center];
}

... не работает, потому что центральная точка находится в системе координат суперпредставления, а НЕ в корневом представлении.Суперпредставление можно перетащить далеко от центра корневого представления.

Сначала я прошел по иерархии суперпредставления, чтобы найти корневой вид, но это все равно не сработало, опять же из-за различных систем координат и разнообразиямасштабировать, чтобы пользователь мог применить к каждому подклассу UIImageView на каждом уровне вложенных представлений.

Я не нашел полного решения для SO, поэтому я написал свое собственное и разместил его здесь.Надеюсь, это сэкономит время и сэкономит время.

1 Ответ

0 голосов
/ 01 октября 2018

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