首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在superview中查找子视图的位置

在superview中查找子视图的位置
EN

Stack Overflow用户
提问于 2012-08-30 18:56:52
回答 1查看 466关注 0票数 2

你好,我有一个superview,其中我有许多UIImageViews.I。我已经在SuperView中添加了UIPanGesture,在我的例子中是'View.m‘。我需要获得引用或其他话对象的UIImageView (子视图)当用户拖动它在superview.Also中,如果这可以做到' hittest‘,然后让我知道如何在gestureHandler中使用它,当hittest返回UIView,我如何才能将UiView转换为UIImageView。以下是我的代码

代码语言:javascript
复制
//
//  View.m
//  PuzzleGame
//
//  Created by Noman Khan on 8/29/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "View.h"
#define  noOfRows 5
#define  noOfCols 4
@implementation View
@synthesize imageArray;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }

    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.

- (void)initImageView {
    int x = 1;
    int y = 1;
//    int width = 190;
//    int height = 198;
    int width = sizeOfRows;
    int height = sizeOfCols;

    UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(x,y,width-10,height+5)]; 
    imgView.image=[UIImage imageNamed:@"iceage_01.png"];
    [self addSubview:imgView];

    x=x+(width-9);
    y=y+(sizeOfCols+9);

    UIImageView *imgView1=[[UIImageView alloc]initWithFrame:CGRectMake(x,y,width-10,height+5)]; 
    imgView1.image=[UIImage imageNamed:@"iceage_02.png"];
    [self addSubview:imgView1];





- (void)drawRect:(CGRect)rect
{
    imageArray=[[NSArray alloc]initWithObjects:[UIImage imageNamed:@"iceage_01.png"],[UIImage imageNamed:@"iceage_02.png"],[UIImage imageNamed:@"iceage_03.png"],[UIImage imageNamed:@"iceage_04.png"],[UIImage imageNamed:@"iceage_05.png"],[UIImage imageNamed:@"iceage_06.png"],[UIImage imageNamed:@"iceage_07.png"],[UIImage imageNamed:@"iceage_08.png"],[UIImage imageNamed:@"iceage_09.png"],[UIImage imageNamed:@"iceage_10.png"],[UIImage imageNamed:@"iceage_11.png"],[UIImage imageNamed:@"iceage_12.png"],[UIImage imageNamed:@"iceage_13.png"],[UIImage imageNamed:@"iceage_14.png"],[UIImage imageNamed:@"iceage_15.png"],[UIImage imageNamed:@"iceage_16.png"],[UIImage imageNamed:@"iceage_17.png"],[UIImage imageNamed:@"iceage_18.png"],[UIImage imageNamed:@"iceage_19.png"],[UIImage imageNamed:@"iceage_20.png"], nil];
    CGContextRef content=UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(content, 2);
    CGContextSetStrokeColorWithColor(content, [UIColor whiteColor].CGColor);

    int totalWidth=self.frame.size.width;
    int totalHeight=self.frame.size.height;

     sizeOfRows=totalHeight/noOfRows;
     sizeOfCols=totalWidth/noOfCols;
    //making rows
    int x = 0,y = 0;

    for (int i=0; i<noOfRows+1; i++) {
        CGContextMoveToPoint(content, x, y);
        CGContextAddLineToPoint(content, 1000, y);
        CGContextStrokePath(content);
        //y=y+200;
        y=y+sizeOfRows;
    }
    //making colums
    x=0,y=0;
    for (int i=0; i<noOfCols+1; i++) {
        CGContextMoveToPoint(content, x, y);
        CGContextAddLineToPoint(content, x, 1000);
        CGContextStrokePath(content);
        //x=x+192;
        x=x+sizeOfCols;
    }

    [self initImageView];

    UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panHandler:)];
    [self addGestureRecognizer:panGesture];
    //    CGContextMoveToPoint(content, 20, 20);
    //    CGåContextAddLineToPoint(content, 50, 50);
    //    
    //    CGContextStrokePath(content);
}



- (void)panHandler:(UIGestureRecognizer *)sender{

    CGPoint point=[sender locationInView:self];

    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"BEgin");
        UIView *v=[[UIView alloc]initWithFrame:CGRectMake(75, 75, 100, 100)];
     v   = [self hitTest:point withEvent:nil];
      //  UIImageView *imv=(UIImageView*)v;   
        [self addSubview:v];
    }
    if (sender.state == UIGestureRecognizerStateChanged) {
        NSLog(@"moved");
    }
    if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"end");
    }
   // NSLog(@"In Pan Handler");

}

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-30 19:38:06

是的,你可以使用hittest。hittest以递归的方式工作,下面是关于Hittest的一些要点。1.调用self 2的pointInside:withEvent:,如果调用,则hitTest:withEvent:返回nil。您的视图层次结构是end。您没有进一步的视图。3.如果返回YES,则将消息传递给子视图,从顶层的子视图开始,继续到其他视图,直到某个子视图返回非空对象或者所有的子视图都收到该消息。4.如果没有nil对象返回nil,则返回self

UIImageView是UIView的子类,因此您可以将您的hittest返回视图转换为UIImageView:

UIImageView *imageView = (UIImageView *)[UIView allocinitWithFrame:CGRectMake(75,75,100,100)];

你可以使用视图的标签属性来获得更好的处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12195303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档