使用CGAffineTransformScale()设置视图的变换时,如何防止子视图重新调整大小

5

如果我执行:

view.transform = CGAffineTransformScale(view.transform, s, s);

我的视图被缩放了,但是它的子视图也被缩放了...我不想让子视图改变大小。显然autoresizesSubviews对此无效。

2个回答

2
假设您的UIView堆栈排列如下:
@interface UIResizableView : UIView <UIGestureRecognizerDelegate> {
    UILabel *innerView;
    CGPoint startPoint;
}
@end

@implementation UIResizableView
- (id)initWithFrame:(CGRect)aFrame {
    self = [super initWithFrame:aFrame];
    if (self) {
    innerView = [[UILabel alloc] initWithFrame: CGRectMake(10, 10, 115, 50)];
    [innerView setFont:[UIFont systemFontWithSize:7]];
    [innerView setTextColor:[UIColor blackColor]];
    [innerView setBackgroundColor:[UIColor clearColor]];
    [innerView setTextAlignment:UITextAlignmentCenter];
    [innerView setText:@"hello world!"];
    [self innerView];
    [innerView release];

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
    [pinchRecognizer setDelegate:self];
    [self addGestureRecognizer:pinchRecognizer];
    [pinchRecognizer release];
    }
    return self;
}
@end

那么你的比例方法应该如下所示。请注意,“内部视图”的“重新定位”需要再次将子视图居中到原始位置。

-(void)scale:(id)sender {
    static float lastScale = 0.0;
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
        lastScale = 1.0;
        return;
    }
    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);

    CGAffineTransform currentTransform = self.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
    [self setTransform:newTransform];

    CGAffineTransform originalSize = CGAffineTransformInvert(self.transform);
    CGAffineTransform originalPositionAndSize = CGAffineTransformTranslate(originalSize, self.frame.origin.x, self.frame.origin.y);
    [innerView setTransform:originalPositionAndSize];

    innerView = CGRectMake(10, 10, 115, 60);

    lastScale = [(UIPinchGestureRecognizer*)sender scale];
}

0
也许你是在对父视图应用变换后才添加子视图(并使用父视图的框架值来设置大小)。至少我以前就是这么做的。
我不得不通过应用一个倒置来进行补偿。
CGRect parentOriginalFrame = CGRectApplyAffineTransform(parentView.frame, CGAffineTransformInvert(parentView.transform));

现在有了父级的原始框架,您可以为子级设置正确的框架值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接