【问题标题】:How to resize all subviews/sublayers when superview is resized?调整超级视图大小时如何调整所有子视图/子层的大小?
【发布时间】:2014-12-04 16:05:03
【问题描述】:

这个问题与项目有关:https://github.com/FindForm/FFAngularPointilism

目前,所有行为都由原始 UIImage 的尺寸决定。尽管调整大小、缩小和旋转,“双三角形正方形”的绘制保持不变。无论应用它的 UIImageView 的边界如何,三角形模糊都不会改变。

在我的 UIImageView 子类中,我使用 UIImage 进行初始化,并在指定的初始化程序中调用以下代码:

- (void)loadMatrix
{
num = 12;

CGFloat width = self.bounds.size.width;
CGFloat height = self.bounds.size.height;
CGFloat theBiggestSideLength = MAX(width, height);

_array = [NSMutableArray array];
_array2 = [NSMutableArray array];

for(int i = 0; i < theBiggestSideLength; i += num)
{
    [self.array addObject:[NSMutableArray array]];
    [self.array2 addObject:[NSMutableArray array]];
}

for(int i = 0; i < self.array.count; i++)
{
    for(int j = 0; j < self.array.count; j++)
    {
        [self.array[i] addObject:[self getRGBAsFromImage:self.image
                                                     atX:j * 2 * num
                                                    andY:i * 2 * num]];

        int xIndex = ((j * 2 * num) - (num / 2.0));
        int yIndex = ((i * 2 * num) + (num / 2.0));
        xIndex %= (int)width * 2;
        yIndex %= (int)width * 2;
        NSLog(@"%d", xIndex);

        [self.array2[i] addObject:[self getRGBAsFromImage:self.image
                                                      atX:xIndex
                                                     andY:yIndex]];
    }
}

_imageGrayscaleView = [[UIImageView alloc] initWithImage:[self convertToGreyscale:self.image]];
_finalbwimage = self.imageGrayscaleView.image;
_imageGrayscaleView.frame = self.bounds;
[self insertSubview:_imageGrayscaleView atIndex:0];

_viewMask = [[UIView alloc] initWithFrame:self.frame];

_viewMask.center = CGPointMake(_viewMask.center.x,
                               _viewMask.center.y + _viewMask.frame.size.height / 2.0f);


_shapeLayer = [[CAShapeLayer alloc] init];
CGRect maskRect = CGRectZero;
CGPathRef path = CGPathCreateWithRect(maskRect, NULL);
_shapeLayer.path = path;
CGPathRelease(path);
self.imageGrayscaleView.layer.mask = _shapeLayer;
}

为了绘制这些图块,我添加了一个计时器并在每个间隔调用以下方法。 Num 和 row 正在按预期更新。:

- (void)drawTile
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(pixel * num, row * num, num, num)];
view.backgroundColor = [self.array[row] objectAtIndex:pixel];
[self addSubview:view];
[self.ksubviews addObject:view];
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(view.frame.origin.x , view.frame.origin.y + (view.frame.size.height))];
[path addLineToPoint:CGPointMake(view.frame.origin.x , view.frame.origin.y)];
[path addLineToPoint:CGPointMake(view.frame.origin.x + view.frame.size.width, view.frame.origin.y + view.frame.size.height)];
[path closePath];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = path.CGPath;
shapeLayer.strokeColor = [[UIColor blackColor] CGColor];
shapeLayer.fillColor = [((UIColor *)[self.array2[row] objectAtIndex:pixel]) CGColor];
shapeLayer.lineWidth = 0;
[self.layer addSublayer:shapeLayer];
[self.ksublayers addObject:shapeLayer];
}

以下是正确的行为:

当通过笔尖调整此图像的大小或以编程方式设置其边界时,可动画的三角形正方形不会改变。

【问题讨论】:

  • 我什么都不懂。
  • 你知道如何处理 uiview 大小/旋转的变化吗?

标签: ios objective-c uiview uiimageview core-graphics


【解决方案1】:

您在类中的 Draw Rect 方法上进行所有子视图的更改,每次对父视图进行更改时,您都会调用方法 setNeedDisplay。

我不太明白你的问题,但我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多