Программно создавать представления в IOS (как это работает)?
Небольшой фон: я просматриваю видео в формате CS193P iTune, и я застрял в задании 3 в течение самого долгого времени. В основном, задание запрашивает у вас программное создание пользовательского представления для отображения формы на экране. Кстати, я не использую никаких контроллеров.
Мне не удалось отобразить мое представление, пока я, наконец, не перетащил объект View в Interface Builder и не изменил имя объекта в свой пользовательский класс просмотра. Поэтому мой вопрос заключается в том, когда люди говорят, что программно создают представление, просто они говорят, что вручную создают класс, но когда вам нужно отображать его, используйте IB? Я не могу не чувствовать, что я что-то не понял?
изменить: позвольте мне быть более ясным. Мое пользовательское представление было инициализировано фреймом 0, 0, 200, 150 и drawRect переопределено, чтобы нарисовать в нем квадрат. Мой просмотр даже не отображается, если попытаться добавить его в главное окно моего контроллера:
UIWindow* window = [UIApplication sharedApplication].keyWindow;
[window addSubview:polygonView];
Однако, если использование перетащить представление в IB и изменить класс на мой класс представления, оно отображается нормально.
Изменить: добавлен код. Это мой метод awakeFromNib моего контроллера, где нужно отобразить представление.
- (void)awakeFromNib {
shape = [[PolygonShape alloc] initWithNumberOfSides:numberOfSidesLable.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
polygonView = [[PolygonView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UIWindow *window = [UIApplication sharedApplication].keyWindow;
polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[self updateInterface];
}
Часть моего контроллера updateInterface:
- (void)updateInterface {
[polygonView setPolygon:shape];
[polygonView setNeedsDisplay];
...
}
PolygonView.h
#import <UIKit/UIKit.h>
#import "PolygonShape.h"
@interface PolygonView : UIView {
IBOutlet PolygonShape *polygon;
}
@property (readwrite, assign) PolygonShape *polygon;
- (void)drawRect:(CGRect)rect;
@end
PolygonView.m
#import "PolygonView.h"
@implementation PolygonView
@synthesize polygon;
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
nslog(@"initialized");
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGRect bounds = [self bounds];
[[UIColor grayColor] set];
UIRectFill(bounds);
CGRect square = CGRectMake(10, 10, 10, 100);
[[UIColor blackColor] set];
UIRectFill(square);
[[UIColor redColor] set];
UIRectFill(square);
NSLog(@"drawRect called");
}
@end
Инициализируется polygonView, но drawRect не вызывается.
Ответы
Ответ 1
Чтобы быть более конкретным для вашего вопроса, синтаксисом будет
UIWindow* window = [UIApplication sharedApplication].keyWindow;
UIView *polygonView = [[UIView alloc] initWithFrame: CGRectMake ( 0, 0, 200, 150)];
//add code to customize, e.g. polygonView.backgroundColor = [UIColor blackColor];
[window addSubview:polygonView];
[polygonView release];
Это шаблон, который вы будете использовать не только для этого, но и для подзаголовков. Кроме того, еще одна заметка касается многих шаблонов, viewController уже настроен с его собственным представлением. Когда вы хотите создать пользовательский вид, вы создаете его, как указано выше, но вместо вышеописанного метода вы устанавливаете представление viewControllers на вновь созданный вид следующим образом:
viewController.view = polygonView;
Удачи!
Ответ 2
Это старый вопрос, но я не уверен, что он получил ответ, который он ожидал, - похоже, он столкнулся с той же проблемой, что и я, когда создал подкласс UIViewController
, ударил UIViewController
в интерфейсе builder nib, но потом не мог понять, как заставить двух работать друг с другом.
Если вы сделали nib отдельно (так что он не был создан для вас рядом с вашим классом), вы должны помнить, чтобы щелкнуть UIViewController, который вы разместили в построителе интерфейса, а затем из панели свойств нажмите кнопку третьей вкладки ( "Пользовательский класс" ). Class
будет базовым классом по умолчанию UIViewController
и т.д. - просто откройте этот раскрывающийся список, и вы увидите список всех ваших подклассов, выберите его и volla - вы связали свой пользовательский элемент с интерфейсом.
Надеюсь, что кто-то спасет меня в те дни, когда мне потребовалось выяснить, я нашел несколько глупо замечательных способов обойти это, пока не понял простое решение.
Ответ 3
Для добавления подпрограммы необходимо иметь представление (или окно). Обычный синтаксис выглядит следующим образом:
UIView *newView = [[UIView alloc] initWithFrame:mainView.bounds];
[mainView addSubview:newView];
[newView release];
Конечно, если у вас есть пользовательский объект, который наследует UIView, вы должны использовать это вместо UIView. Когда вы начинаете новый проект, создайте "приложение на основе представления", которое запустит вас с помощью контроллера представления с соответствующим представлением (к которому можно получить доступ с помощью "CustomViewController.view", который заменит "mainView" в фрагменте кода выше).
Если вы хотите создать представление программно, когда приложение запустится, поместите код в метод "- (void) viewDidLoad" вашего контроллера представления.
Ответ 4
Привет, просто добавьте этот код,
[window bringSubviewToFront:polygonView];
right after,
[window addSubview:polygonView];
Ответ 5
Где-то в вашем активном классе контроллера вы можете добавить пользовательский вид в текущий вид верхнего уровня.
[ myCurrentTopView addSubview: myNewCustomView ];
Это помогает сначала выделить и инициализировать это пользовательское представление.
Затем вы можете вызвать какой-либо чертеж в этом пользовательском представлении drawRect, выполнив:
[ myNewCustomView setNeedsDisplay ];
Ответ 6
Вы задали цвет фона вашего представления чему-то различимому?
Вы уверены, что ваше представление не отображается, или вы просто не видите его? Поместите NSLog в метод drawRect: (ваш пользовательский класс).
Ответ 7
В последнее время у меня была очень похожая проблема, и вот то, что сработало для меня:
Похоже, что при запуске с "пустым приложением" в Xcode 4.3.2 вы должны установить свое представление в качестве корневого представления в главном окне, используя метод setRootViewController вместо addSubview. Итак:
// Initialize myView and then
[window setRootViewController:myView];
// instead of [window addSubview:myView];
// the rest as normal...
[window makeKeyAndVisible];
После этого вы можете использовать метод addSubview для добавления дополнительных представлений.
Ответ 8
Вызов
[super drawRect];
перед вашим пользовательским кодом в drawRect: body.
Ответ 9
UIView *parentview=[[UIView alloc]initWithFrame:CGRectMake(50, 50, 300, 300)];
parentview.backgroundColor=[UIColor orangeColor];
UIView *childview1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
childview1.backgroundColor=[UIColor blueColor];
UIView *childview2=[[UIView alloc]initWithFrame:CGRectMake(20, 20, 50, 50)];
childview1.backgroundColor=[UIColor grayColor];
[parentview addSubview:childview1];
[parentview addSubview:childview2];
[self.view addSubview:parentview];