旋转变换后更改 uiview 大小

2024-03-19

我的代码需要专业 xcoder 的帮助:-)

我有一个名为“headline”的可拖动 uitextview,它是“mainstage”中的子视图。我还添加了捏合手势来更改 uitextview 内的字体大小。一切工作正常,但我真正需要的最后一个基本功能是 uitextview 的旋转。

所以我添加了一个uislider用于旋转和volia!它也有效。但经过这次转换后,当 uitextview 通过捏合手势变成新尺寸时,它会变得疯狂*。 (*uitextview的位置和大小)

经过对文档的一些研究,我发现了“一些有用的警告”(框架):

如果你想要绘制矩形时调用drawRect:方法 更改,将 contentMode 属性设置为 UIViewContentModeRedraw

很好...但我不知道我必须将它放在代码中的哪里...

换句话说:如何在旋转后更改 uiview 的框架大小?(myview.transform)

感谢大家对此的帮助...

这是我的代码:

- (void)viewDidLoad {

    // CREATE MAINSTAGE
    mainstage = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
    mainstage.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
    mainstage.showsVerticalScrollIndicator=NO;
    mainstage.scrollEnabled=NO;
    mainstage.userInteractionEnabled=YES;
    mainstage.backgroundColor = [UIColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 1.0];
    mainstage.layer.masksToBounds = YES;
    [self.view addSubview:mainstage];

    // CREATE HEADLINE
    headline = [[UITextView alloc]initWithFrame:CGRectMake(100, 100, 768, 1024)];
    headline.text = @"Headline\nNo1";
    headline.textColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
    headline.textAlignment = NSTextAlignmentLeft;
    [headline setFont:[UIFont fontWithName:@"Helvetica" size:30]];
    [headline setScrollEnabled:NO];
    [headline setEditable:NO];
    [headline setUserInteractionEnabled:YES];
    [headline setBackgroundColor:[UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5]];
    [headline sizeToFit]; // RESET
    [mainstage addSubview:headline];

    // CREATE ROTATE SLIDER
    CGRect sliderFrameTextRotating = CGRectMake(0, 924, 768, 50);
    self.rotateSlider = [[UISlider alloc] initWithFrame:sliderFrameTextRotating];
    self.rotateSlider.minimumValue = -100.0f;
    self.rotateSlider.maximumValue = 100.0f;
    self.rotateSlider.value = 0.0f;
    [self.rotateSlider setContinuous:true];
    [self.rotateSlider addTarget:self action:@selector(getSliderRotatingValue:)forControlEvents:UIControlEventValueChanged];
    [self.rotateSlider addTarget:self action:@selector(RotateSliderDidEndSliding:)forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
    [mainstage addSubview:self.rotateSlider];


    // GESTURES

    /* drag */
    UIPanGestureRecognizer *TextdragRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(textviewDragged:)];
    [headline addGestureRecognizer:TextdragRecognizer];

    /* pinch */
    UIPinchGestureRecognizer *twoFingerPinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPinch:)];
    twoFingerPinch.cancelsTouchesInView = FALSE;
    twoFingerPinch.delaysTouchesEnded = TRUE;
    [headline addGestureRecognizer:twoFingerPinch];

    [super viewDidLoad];
}


// ROTATE
- (IBAction)getSliderRotatingValue:(id)paramSender {

    headline.transform = CGAffineTransformMakeRotation(rotateSlider.value * 2*M_PI / rotateSlider.maximumValue);
    headline.contentMode = UIViewContentModeRedraw; // ?
}

// ROTATE SLIDER END
- (void)RotateSliderDidEndSliding:(NSNotification *)notification {

}


// DRAG
- (void)textviewDragged:(UIPanGestureRecognizer *)gestureRecognizer {

    UIView *piece = (UIView *)gestureRecognizer.view;

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

        [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
        [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
    }

    else if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {

    }
}



// PINCH TEXT
- (void) twoFingerPinch:(UIPinchGestureRecognizer *) recognizer {

    CGPoint touchPoint = [recognizer locationInView:mainstage];
    UIView *touchView = [mainstage hitTest:touchPoint withEvent:nil];

    // BEGAN
    if (recognizer.state == UIGestureRecognizerStatePossible || recognizer.state == UIGestureRecognizerStateBegan) {

        if([touchView isKindOfClass:[UITextView class]]) {

            touchView.tag = 1;
            UITextView *myViewWithTag = (UITextView *)[touchView viewWithTag:1];
            myViewWithTag.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5];

        }

    }

    // CHANGED
    else if (recognizer.state == UIGestureRecognizerStateChanged) {

        UITextView *myViewWithTag = (UITextView *)[self.view viewWithTag:1];
        touchView.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5];

        CGFloat scale = recognizer.scale;
        myViewWithTag.font = [UIFont fontWithName:myViewWithTag.font.fontName size:myViewWithTag.font.pointSize*scale];
        [self textViewDidChange:myViewWithTag];

        recognizer.scale = 1.0f;

    }

    // ENDED
    else if (recognizer.state == UIGestureRecognizerStateEnded) {

        UITextView *myViewWithTag = (UITextView *)[self.view viewWithTag:1];
        touchView.backgroundColor = [UIColor colorWithRed: 0.0 green: 0.0 blue: 0.0 alpha: 0.5];

        if (myViewWithTag.textAlignment == NSTextAlignmentLeft) {

            [touchView sizeToFit];

        }
    }
}


// TEXTVIEW DID CHANGE
- (void)textViewDidChange:(UITextView *)textView {

    UITextView *myViewWithTag = (UITextView *)[textView viewWithTag:1];

    if (myViewWithTag.textAlignment == NSTextAlignmentLeft) {

        myViewWithTag.frame = CGRectMake(myViewWithTag.frame.origin.x, myViewWithTag.frame.origin.y, 768, 1024);

        // [myViewWithTag sizeToFit];
    }
}


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    // if the gesture recognizers are on different views, don't allow simultaneous recognition
    if (gestureRecognizer.view != otherGestureRecognizer.view)
        return NO;

    // if either of the gesture recognizers is the long press, don't allow simultaneous recognition
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
        return NO;

    return YES;
}

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = [gestureRecognizer locationInView:piece];
        CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;
    }
}



- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

旋转变换后更改 uiview 大小 的相关文章

随机推荐

  • 实现游程编码

    我编写了一个程序来执行游程编码 在典型情况下 如果文本是 AAAAAABBCDEEEEGGHJ 游程长度编码将使其 A6B2C1D1E4G2H1J1 但它为每个非重复字符添加了额外的 1 因为我用它压缩 BMP 文件 所以我想到了放置一个标
  • GPS 位置未正确检索

    我是 Android 开发新手 我了解 Android 活动生命周期 请看下面的代码 public class MyTest extends Activity Override public void onCreate Bundle sav
  • *.suo 文件中实际包含什么?

    我读过有关解决方案用户选项文件的 MSDN 文章 https msdn microsoft com en us library bb165909 aspx 解决方案用户选项文件用于存储用户首选项设置 并在 Visual Studio 保存解
  • 对具有相似名称的多组列使用相同的 mutate

    想象一下以下数据 data lt tribble a1 a2 b1 b2 c1 c2 32 32 50 12 12 50 48 20 55 43 10 42 对于 i 1 2 我想计算deltai ai ci ai bi ci ai 我明确
  • TCP/IP 套接字是原子的吗?

    据我了解 如果写入的数据量很小 则对 TCP IP 套接字的写入将是原子的 我所说的原子性是指接收者将接收所有数据或不接收任何数据 但是 如果写入的数据量很大 则它不是原子的 我对么 如果是的话 什么算大呢 谢谢 鲍勃 不 TCP 是一种字
  • Executor 和 ExecutorService 有什么区别? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想知道 Executor 和 Ex
  • 在 BlackBerry 中单击事件期间更改 ButtonField 背景

    在 BlackBerry 中 如何更改ButtonField点击事件期间的背景颜色 例如 对于长按 背景颜色需要改变 对我来说 它采用默认颜色蓝色 如何改变呢 这是我们的自定义按钮字段 但它显示按钮单击事件的默认蓝色 public clas
  • 高效地从TextureView获取Bitmap

    我试图从一个TextureView 不幸的是尝试 textureView getBitmap 导致性能缓慢是否有更快的方法来获取位图 使用 NDK 是否更好 寻找实际例子 TextureView 接收 SurfaceTexture 上的帧
  • 当前对控制器类型 {1} 上的操作 {0} 的请求不明确

    我有两个动作 我想要我的路线 users and users id 与众不同 然而它给我带来了错误 是否可以在不手动创建的情况下实现这种事情every路线 我将有其他控制器将遵循类似的模式 并为所有这些控制器编写自定义路线 一般来说似乎是多
  • 请求网站时,Javascript 用户代理 (ajax) 与发送的用户代理不同

    我注意到我的手机 OnePlus 3 Android 8 0 0 上的 Chrome 64 0 3282 137 在请求网页时发送的用户代理与通过 ajax 发送的请求略有不同 该用户代理在请求网页时发送 Mozilla 5 0 Linux
  • 将字符串转换为 React JSX

    Goal 我想将包括 React 组件的字符串转换为功能齐全的 JSX 更简单的例子是这样的 Stack Overflow 上有很多解决方案 render let txt span b Hello World b span return d
  • 如何检查输入值是否在数组中(Powershell)

    InputArray a e i o u 1 2 3 4 5 UserInput Enter any value 我们如何检查 UserInput is in InputArray或不提示输入正确 Use the contains操作员 I
  • 在 r 中创建一个基于其他列自动递增的列

    我的数据框有客户 ID 产品和日期 我需要创建一个列 每次 customerID 或日期更改时都会生成交易 ID 我的数据框目前看起来像 客户 ID 产品 日期 23 abv 12 12 14 23 政府飞行服务处 12 12 14 18
  • 如何使用 Firebase Cloud Messaging 将推送通知发送到多个设备

    我正在寻找一种将推送消息从我的 Express JS 服务器传递到我的离子应用程序的方法 我发现GCM 使用 GCM 我可以传递传递令牌列表的消息 如下所示 sender send message registrationTokens de
  • AddressSanitizer 中的“影子字节”是什么?我应该如何解释它们?

    我正在调试 C 程序并且严重困惑当发现问题时 大约是 AddressSanitizer 输出的下半部分 让我们以此为例 33184 ERROR AddressSanitizer heap buffer overflow on address
  • JavaScript 异步编程新手。有什么建议吗?

    异步回调很棒 但是当一个回调依赖于另一个回调的结果时 我会使用具有回调的 api 调用进行回调 等等 apiCall function apiCall function apiCall function 我可以命名回调函数 而不是将它们内联
  • 如何在 IntelliJ 14 中从临时文件运行代码?

    我创建了一个简单的 Java 临时文件 其中包含一个名为 测试泛型 包含一些代码和main方法 代码似乎没问题 但是当我尝试运行它时 通过右键单击 gt 运行 TestGenerics main 我收到此错误 未指定模块 包含 Lua 代码
  • C# 客户端连接到 kerberos kdc

    我正在为连接到 kerberos kdc 的客户端寻找一些示例 C 代码 None
  • 如何在Python中从掩模分割图像创建轮廓(具有可控的厚度)?

    这里我有一个分割模型的分割输出图像 我想为这些蒙版创建一个轮廓 然后将该轮廓放在原始图像上 以将图像上的预测区域指示为分割输出 我尝试使用 PIL 过滤器 FIND EDGES 但它为轮廓提供了非常薄的边缘 有什么方法可以将此蒙版图像转换为
  • 旋转变换后更改 uiview 大小

    我的代码需要专业 xcoder 的帮助 我有一个名为 headline 的可拖动 uitextview 它是 mainstage 中的子视图 我还添加了捏合手势来更改 uitextview 内的字体大小 一切工作正常 但我真正需要的最后一个