【问题标题】:When to change the frame size of a UIView while custom drawing it?自定义绘制时何时更改 UIView 的框架大小?
【发布时间】:2025-12-08 01:40:01
【问题描述】:

我正在我的应用程序中为 drawRect 方法中的视图进行自定义绘制。

我捕获了用户的捏合手势,并基于此,我想在每次执行此操作时更改视图的帧大小。

我尝试在 drawRect 方法中更改 UIView 的框架。但我觉得这样做是错误的,因为 drawRect 要求我们绘制特定的矩形。

我确实创建了一个协议,当我捕获时,我尝试在协议方法的帮助下从视图控制器更改视图的帧大小。但这也没有用。

我怎样才能做到这一点?

更新:

我能够从自定义 UIView 的 awakeFromNib 方法更改 UIView 的框架。但是我有必要根据用户的操作定期更改框架,并且没有找到任何方法来重新加载 awakeFromNib 方法..

【问题讨论】:

    标签: ios uiview drawrect


    【解决方案1】:

    这些只是示例,需要根据您的具体情况进行修改,但您可以使用 CGRectApplyAffineTransformUIView 动画:

    - (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
        UIView *senderView = sender.view;
        if (sender.state == UIGestureRecognizerStateBegan) {
            initialFrame = senderView.frame;
        }
        CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];
        CGAffineTransform zt = CGAffineTransformScale(CGAffineTransformIdentity, factor, factor);
        senderView.frame = CGRectApplyAffineTransform(initialFrame, zt);
        return;
    }
    
    /* -------------------------------------------------------------------------- */
    
    - (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender {
        UIView *senderView = sender.view;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:0.35f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    
        /* Set changes for the animation before calling commitAnimations
        self.tableView.layer.borderWidth = 3.0;
        self.tableView.layer.borderColor = [[UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:0.85] CGColor];
        self.tableView.layer.backgroundColor = [[UIColor colorWithWhite:0.2 alpha:0.5] CGColor];
        self.tableView.layer.shadowOffset = CGSizeMake(4.0, 2.0);
        self.tableView.layer.shadowColor = [[UIColor blackColor] CGColor];
        self.tableView.layer.shadowOpacity = 1.0;
        self.tableView.layer.shadowRadius = 2.0;
        self.tableView.layer.cornerRadius = 10.0;
        */
    
        [UIView commitAnimations];
    }
    

    【讨论】:

    • 感谢您的回答。为它+1。但我还有一个疑问,我不想根据用户的捏合来增加框架的大小。相反,我想在某些情况下将帧大小更改为某个 CGRect。如何将我的 CGrect 应用于此转换?
    最近更新 更多