touchesBegan被AppDelegate捕获而不是UIView的子类

时间:2016-12-16 23:47:45

标签: ios objective-c uiview appdelegate touchesbegan

我正在阅读The Big Nerd Ranch指南的iOS编程第5章(第4版,想要目标C),我按照子类化UIView类的说明进行操作,并在AppDelegate中添加了子视图},问题是子视图没有捕获touchesBegan事件, ,但AppDelegate正在捕捉信号。

didFinishLaunchingWithOptions中的

AppDelegate方法:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setRootViewController:[UIViewController alloc]];

CGRect firstFrame = self.window.bounds;

HypnosisView *firstView = [[HypnosisView alloc] initWithFrame:firstFrame];
[self.window addSubview:firstView];
[firstView becomeFirstResponder];

self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];

return YES;

HypnosisView的两个初始化方法,UIView的子类定义如下:

#import "HypnosisView.h"

@interface HypnosisView ()

@property (strong, nonatomic) UIColor *circleColor;

@end

@implementation HypnosisView

// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    CGRect bounds = self.bounds;
    CGRect frame = self.frame;

    // Figure out the center of the bounds rectangle
    CGPoint center;
     center.x = frame.origin.x + frame.size.width / 2.0;
    center.y = frame.origin.y + frame.size.height / 2.0;

    // The largest circle will circumscribe the view
    float maxRadius = hypot(bounds.size.width, bounds.size.height) / 2.0;

     UIBezierPath *path = [[UIBezierPath alloc] init];

    for (float currentRadius = maxRadius; currentRadius > 0; currentRadius -= 20) {
        [path moveToPoint:CGPointMake(center.x + currentRadius, center.y)];

        [path addArcWithCenter:center
                    radius:currentRadius
                startAngle:0.0
                  endAngle:M_PI * 2
                 clockwise:YES];
    }

    // Configure line with to 10 points
    path.lineWidth = 10;

    // Configure the drawing color to light gray
    [self.circleColor setStroke];

    // Draw the line!
    [path stroke];
}

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // All HypnosisViews start with a clear background color
        self.backgroundColor = [UIColor clearColor];
        self.circleColor = [UIColor lightGrayColor];

        self.userInteractionEnabled = YES;
    }
    return self;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%@ was touched", self);
}

2 个答案:

答案 0 :(得分:2)

Appdelegate.m中,您应首先makeKeyAndVisible windowmakeKeyAndVisiblewindow设置为keyWindow,并将window位于所有windows的前面。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window setRootViewController:[UIViewController alloc]];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    CGRect firstFrame = self.window.bounds;

    HypnosisView *firstView = [[HypnosisView alloc] initWithFrame:firstFrame];
    [self.window addSubview:firstView];
    [firstView becomeFirstResponder];



    return YES;
}

答案 1 :(得分:-1)

UIView对象通常不会对触摸事件做出反应。您是否为视图设置了userInteractionEnabled标志为true?

那些没有被调用的touchesBegan方法在哪里?