【问题标题】:[C4]conflict between pan recognizer and slider[C4]平移识别器和滑块之间的冲突
【发布时间】:2013-10-17 13:44:21
【问题描述】:

我正在尝试平移和放大图像。由于 C4 中还没有平移手势,我想我可以在开始时使用滑块。 所以我将平移手势添加到照片中,如下所示:

-(void)photoToCrop{
    photoTaken=[C4Image imageNamed:@"image.jpg"];
    photoTaken.height=self.canvas.height;
    photoTaken.origin=CGPointMake(0, 0);
    [self.canvas addImage:photoTaken];
    [self addGesture:PAN name:@"pan" action:@"movePhoto:"];

}
-(void)movePhoto:(UIPanGestureRecognizer *)recognizer {
    CGPoint thePoint=[recognizer locationInView:self.view];
    //C4Log(@"current position:%f,%f",thePoint.x, thePoint.y);
    if (thePoint.x>photoTaken.origin.x &&thePoint.x<photoTaken.origin.x+photoTaken.width && thePoint.y>photoTaken.origin.y &&thePoint.y<photoTaken.origin.y+photoTaken.height) {
        C4Log(@"touched inside+moved");
        [photoTaken move:recognizer];
    }

}

我只在用户实际点击图像而不是外部任何地方时使用平移手势(那是那里的 if 语句) 它本身工作得很好。 然后我还附加了一个滑块来缩放相同的图像:

-(void)sliderSetup{
    [self createAddSliderObjects];
    zoomSlider.minimumValue=0.52f;
    zoomSlider.maximumValue=10.0f;
    //scalefactor=1;
    zoomSlider.value=1.0f;

}
-(void)createAddSliderObjects{
    sliderLabel=[C4Label labelWithText:@"1.0"];
    sliderLabel.textColor=navBarColor;
    zoomSlider=[C4Slider slider:CGRectMake(0, 0, self.canvas.width-20, 20)];

    //positioning
    sliderLabel.center=CGPointMake(self.canvas.width/2,self.canvas.height-NavBarHeight-50);
    zoomSlider.center=CGPointMake(sliderLabel.center.x,sliderLabel.center.y+10);

    //set up action
    [zoomSlider runMethod:@"sliderWasUpdated:"
                   target:self
                 forEvent:VALUECHANGED];
    [self.canvas addObjects:@[sliderLabel, zoomSlider]];
}
-(void)sliderWasUpdated:(C4Slider*)theSlider{
    //update the label to reflect current scale factor
    sliderLabel.text=[NSString stringWithFormat:@"%4.2f", theSlider.value];
    [sliderLabel sizeToFit];

    //scale the image
    C4Log(@"slider:%f",theSlider.value);
    photoTaken.height=self.canvas.height*theSlider.value;
    photoTaken.center=self.canvas.center;
}

它本身也可以正常工作。 但是试图同时使用两者是行不通的。在这种情况下,只有平移图像有效,但滑块不会发生任何事情。似乎它没有得到任何触发器...... 有人建议我还能尝试什么吗?

【问题讨论】:

    标签: ios objective-c c4


    【解决方案1】:

    问题是您正在向canvas 添加平移手势,而C4Slider 的控制方法实际上是平移手势。因此,附加到画布的手势优先,使用手势移动照片,并且不会将该手势传递给 C4Slider 以使其移动。

    简单的解决方案是将平移手势附加到C4Image,这样滑块和图像就不会监听相同的事件。

    我已经折叠了一些函数以使示例更易于理解。

    #import "C4WorkSpace.h"
    
    @implementation C4WorkSpace{
        C4Image * photoTaken;
        C4Slider * zoomSlider;
    }
    
    -(void)setup{
    
        photoTaken=[C4Image imageNamed:@"C4Sky.png"];
        photoTaken.width=self.canvas.width;
        photoTaken.origin=CGPointMake(0, 0);
        [self.canvas addImage:photoTaken];
        [photoTaken addGesture:PAN name:@"pan" action:@"move:"];
    
        zoomSlider=[C4Slider slider:CGRectMake(0, 0, self.canvas.width-20, 20)];
        [self.canvas addUIElement: zoomSlider];
        [zoomSlider runMethod:@"sliderWasUpdated:" target:self forEvent:VALUECHANGED];
    
    }
    
    -(void)sliderWasUpdated:(C4Slider*)theSlider{    
        photoTaken.height=self.canvas.height*theSlider.value;
        photoTaken.center=self.canvas.center;
    }
    
    @end
    

    【讨论】:

    • 我不知道我是否做错了什么,但如果我运行该示例,则只有平移工作,但我无法更改滑块值....
    • 奇怪。如果我将此代码粘贴到一个新项目中,它就可以正常工作。您是在新项目中使用它还是在更大的项目中使用它?
    • 我都试过了,但都没有用...我在哪个 iOS/XCode/... 有什么不同吗?
    • 可能。我正在使用 iOS6 测试 XCode 4.6。我注意到你在 XCode 5 上。我还没有测试过。对不起。
    • 是的。我在 XCode 5 和 iOS 7 中...所以我可以尝试使用步进器,看看是否有效...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多