setNeedsDisplay не будет вызывать drawRect
Важный:
Я выяснил проблему, но модератор удалил ее по некоторым причинам:
Я попытался вызвать функцию непосредственно с кнопки, вместо того, чтобы использовать эту функцию в контроллере вида.
Я до сих пор не до конца понимаю, почему это не сработало, поэтому я приму любой ответ на этот вопрос.
Главный пост
Я пытаюсь сделать некоторые рисунки после нажатия кнопки UIB. Мой рисунок сделан в подклассе UIView. У меня есть экземпляр этого подкласса в моем ViewController. У меня также есть UIButton в моем ViewController, который вызывает функцию подкласса. В этой функции я вызываю
[self setNeedsDisplay];
Когда я загружаю свое приложение, drawRect вызывается один раз в момент загрузки представления, но никогда не вызывается снова, хотя setNeedsDisplay вызывается при каждом нажатии кнопки. Я посмотрел на много похожих вопросов и не нашел решения.
Я опубликую весь мой код здесь:
AEViewController.h
#import <UIKit/UIKit.h>
#import "AEGraphView.h"
@interface AEViewController : UIViewController{
IBOutlet AEGraphView *theView;
}
-(IBAction)updateAEGraphView:(id)sender;
@end
AEViewController.m
#import "AEViewController.h"
@interface AEViewController ()
@end
@implementation AEViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
theView = [[AEGraphView alloc] init];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
else {
return YES;
}
}
-(IBAction)updateAEGraphView:(id)sender{
[theView UpdateView];
}
@end
AEGraphView.h
#import <UIKit/UIKit.h>
@interface AEGraphView : UIView{
CGContextRef mainContext;
int power;
int multiplier;
}
-(void)prepareGraphics;
- (void) drawLineFrom:(CGPoint)p1 To:(CGPoint)p2;
-(void)UpdateView;
@end
AEGraphView.m
#import "AEGraphView.h"
@implementation AEGraphView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
[self prepareGraphics];
// Drawing code
NSLog(@"called");
if (power == 0) {
[self drawLineFrom:CGPointMake(100,100) To:CGPointMake(-50, -2)];
}
else {
[self drawLineFrom:CGPointMake(0, 0) To:CGPointMake(150, 150)];
}
[super drawRect:rect];
}
-(void)prepareGraphics{
mainContext = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(mainContext, TRUE);
CGContextSetLineWidth(mainContext, 2);
CGContextSetLineCap(mainContext, kCGLineCapRound);
}
- (void) drawLineFrom:(CGPoint)p1 To:(CGPoint)p2{
NSLog(@"%f,%f to %f,%f", p1.x,p1.y,p2.x,p2.y);
// Begin a path.
CGContextBeginPath(mainContext);
// Add a line to the path.
CGContextMoveToPoint(mainContext, p1.x, p1.y);
CGContextAddLineToPoint(mainContext, p2.x, p2.y);
// Stroke and reset the path.
CGContextStrokePath(mainContext);
}
-(void)UpdateView{
if (power == 0) {
power = 1;
}
else {
power = 0;
}
[self setNeedsDisplay];
}
@end
2 ответа
Решение было иметь функцию, вызываемую из кнопки вместо вызова из функции в контроллере представления, который был вызван кнопкой.
Вы уверены, что ваш выход, который указывает на ваш пользовательский UIView, подключен? Проверьте, если это nil
, Кроме того, вы убедились, что ваша функция вызывается?