gpt4 book ai didi

ios - 随机放置的 UILabel 旋转后尺寸错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:19 24 4
gpt4 key购买 nike

有一个 UIVew 容器,用于随机生成、旋转并放置到该 View 中的多个 UILabel,如果我使用角度 0、90、180、270 看起来不错,但如果角度随机生成的标签看起来展开,这对我来说是个问题因为单词应该放置得非常近并且没有交集,所以生成器看起来是这样的:

- (void) generate:(UIView *)container
words:(NSArray *)words
colors:(NSArray *)colors
minFontSize:(float)minSize
maxFontSize:(float)maxSize
rotateWords:(BOOL)rotate
useAngleRange:(BOOL)useRange
{
usingRange = useRange;
for (int i = 0; i < [words count]; i++) {
UILabel *word_l = [[UILabel alloc] init];
word_l.font = [UIFont fontWithName:@"EuropeBold" size:[self getRandomNumberBetween:minSize to:(i < probableBigFontWords) ? maxSize : (maxSize / 3)]];
[word_l setText:words[i]];
[word_l setTextColor:colors[arc4random_uniform([colors count])]];
[word_l setBackgroundColor:[UIColor clearColor]];
[word_l sizeToFit];

CGRect fr = CGRectMake(0,
0,
word_l.frame.size.width,
word_l.frame.size.height);
word_l.frame = fr;
word_l.center = CGPointMake([self getRandomNumberBetween:175 to:639], [self getRandomNumberBetween:175 to:375]);
if (rotate) {
int angleType = arc4random_uniform(2);
if (useRange) {
int angle = (angleType == 1) ? [self getRandomNumberBetween:0 to:90] : [self getRandomNumberBetween:270 to:360];
[word_l setTransform:CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(angle))];
} else {
[word_l setTransform:CGAffineTransformMakeRotation((angleType == 1) ? DEGREES_TO_RADIANS(270) : DEGREES_TO_RADIANS(360))];
}
}
[container addSubview:word_l];
while ([self viewIntersectsWithAnotherView:container chosenView:word_l]) {
viewPositionMovingStep++;
[self placeItem:container :word_l];
}
}
}

- (void)placeItem:(UIView *)container :(UILabel *)word_l
{
CGRect initFr = word_l.frame;
for (int i = 1; i <= 8; i++) {
CGRect f = word_l.frame;
switch (i) {
case 1:
f.origin.x = f.origin.x + viewPositionMovingStep;
break;
case 2:
f.origin.x = f.origin.x + viewPositionMovingStep;
f.origin.y = f.origin.y + viewPositionMovingStep;
break;
case 3:
f.origin.y = f.origin.y + viewPositionMovingStep;
break;
case 4:
f.origin.x = f.origin.x - viewPositionMovingStep;
f.origin.y = f.origin.y + viewPositionMovingStep;
break;
case 5:
f.origin.x = f.origin.x - viewPositionMovingStep;
break;
case 6:
f.origin.x = f.origin.x - viewPositionMovingStep;
f.origin.y = f.origin.y - viewPositionMovingStep;
break;
case 7:
f.origin.y = f.origin.y - viewPositionMovingStep;
break;
case 8:
f.origin.x = f.origin.x + viewPositionMovingStep;
f.origin.y = f.origin.y - viewPositionMovingStep;
break;
default:
break;
}
word_l.frame = f;
if ([self viewIntersectsWithAnotherView:container chosenView:word_l]) {
word_l.frame = initFr;
} else {
viewPositionMovingStep = 0;
return;
}
}
}

-(BOOL)viewIntersectsWithAnotherView:(UIView *)container chosenView:(UIView *)chosenView
{
for(UIView *view in [container subviews]){
if (![chosenView isEqual:view]){
BOOL framePartiallyOut = !CGRectEqualToRect(CGRectIntersection(chosenView.superview.bounds, chosenView.frame), chosenView.frame);
if (usingRange) {
if([self view:chosenView intersectsWith:view] || framePartiallyOut){
return YES;
}
} else {
if(CGRectIntersectsRect(chosenView.frame, view.frame) || framePartiallyOut){
return YES;
}
}
}
}
return NO;
}

- (BOOL)view:(UIView *)view1 intersectsWith:(UIView *)view2
{
CGPoint poly1[4];
CGRect bounds1 = view1.bounds;
poly1[0] = [view1 convertPoint:bounds1.origin toView:nil];
poly1[1] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y) toView:nil];
poly1[2] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y + bounds1.size.height) toView:nil];
poly1[3] = [view1 convertPoint:CGPointMake(bounds1.origin.x, bounds1.origin.y + bounds1.size.height) toView:nil];

CGPoint poly2[4];
CGRect bounds2 = view2.bounds;
poly2[0] = [view2 convertPoint:bounds2.origin toView:nil];
poly2[1] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y) toView:nil];
poly2[2] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y + bounds2.size.height) toView:nil];
poly2[3] = [view2 convertPoint:CGPointMake(bounds2.origin.x, bounds2.origin.y + bounds2.size.height) toView:nil];

CGPoint ctl2 = [view1 convertPoint:poly2[0] fromView:nil];
if (CGRectContainsPoint(view1.bounds, ctl2)){
return YES;
}
CGPoint ctr2 = [view1 convertPoint:poly2[1] fromView:nil];
if (CGRectContainsPoint(view1.bounds, ctr2)){
return YES;
}
CGPoint cbr2 = [view1 convertPoint:poly2[2] fromView:nil];
if (CGRectContainsPoint(view1.bounds, cbr2)){
return YES;
}
CGPoint cbl2 = [view1 convertPoint:poly2[3] fromView:nil];
if (CGRectContainsPoint(view1.bounds, cbl2)){
return YES;
}
CGPoint ctl1 = [view2 convertPoint:poly1[0] fromView:nil];
if (CGRectContainsPoint(view2.bounds, ctl1)){
return YES;
}
CGPoint ctr1 = [view2 convertPoint:poly1[1] fromView:nil];
if (CGRectContainsPoint(view2.bounds, ctr1)){
return YES;
}
CGPoint cbr1 = [view2 convertPoint:poly1[2] fromView:nil];
if (CGRectContainsPoint(view2.bounds, cbr1)){
return YES;
}
CGPoint cbl1 = [view2 convertPoint:poly1[3] fromView:nil];
if (CGRectContainsPoint(view2.bounds, cbl1)){
return YES;
}
return NO;
}

-(int)getRandomNumberBetween:(int)from to:(int)to
{
return (int)from + arc4random() % (to-from+1);
}

这是正确放置标签的方式:

well transformed subviews

这个示例短词具有随机生成的角度(范围 270-360、0-90):

enter image description here

正如您所注意到的,那里没有显示文本,标签看起来展开了,并且交叉检查器在这种情况下不起作用,如果从 viewDidLoadviewDidApper 调用此检查器根本不起作用,我真的需要帮助,有什么想法吗?谢谢!

最佳答案

调整大小的问题是这样解决的:

- (void)placeItem:(UIView *)container :(UILabel *)word_l
{
CGPoint initPoint = word_l.center;
for (int i = 1; i <= 8; i++) {
switch (i) {
case 1:
word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y);
break;
case 2:
word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y + viewPositionMovingStep);
break;
case 3:
word_l.center = CGPointMake(word_l.center.x, word_l.center.y + viewPositionMovingStep);
break;
case 4:
word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, word_l.center.y + viewPositionMovingStep);
break;
case 5:
word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, word_l.center.y);
break;
case 6:
word_l.center = CGPointMake(word_l.center.x - viewPositionMovingStep, - viewPositionMovingStep);
break;
case 7:
word_l.center = CGPointMake(word_l.center.x, word_l.center.y - viewPositionMovingStep);
break;
case 8:
word_l.center = CGPointMake(word_l.center.x + viewPositionMovingStep, word_l.center.y - viewPositionMovingStep);
break;
default:
break;
}
if ([self viewIntersectsWithAnotherView:container chosenView:word_l]) {
word_l.center = initPoint;
} else {
viewPositionMovingStep = 0;
return;
}
}
}

原因是:使用 transform 属性时,您不能通过更改框架来更改位置,您必须使用 center 属性。

因此这部分已修复,但留下了与旋转 View 相交相关的问题,检查器无法正常工作,但在其他项目中单独测试它表现良好。

他在那里:

- (BOOL)view:(UIView *)view1 intersectsWith:(UIView *)view2
{
CGPoint poly1[4];
CGRect bounds1 = view1.bounds;
poly1[0] = [view1 convertPoint:bounds1.origin toView:nil];
poly1[1] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y) toView:nil];
poly1[2] = [view1 convertPoint:CGPointMake(bounds1.origin.x + bounds1.size.width, bounds1.origin.y + bounds1.size.height) toView:nil];
poly1[3] = [view1 convertPoint:CGPointMake(bounds1.origin.x, bounds1.origin.y + bounds1.size.height) toView:nil];

CGPoint poly2[4];
CGRect bounds2 = view2.bounds;
poly2[0] = [view2 convertPoint:bounds2.origin toView:nil];
poly2[1] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y) toView:nil];
poly2[2] = [view2 convertPoint:CGPointMake(bounds2.origin.x + bounds2.size.width, bounds2.origin.y + bounds2.size.height) toView:nil];
poly2[3] = [view2 convertPoint:CGPointMake(bounds2.origin.x, bounds2.origin.y + bounds2.size.height) toView:nil];

CGPoint ctl2 = [view1 convertPoint:poly2[0] fromView:nil];
if (CGRectContainsPoint(view1.bounds, ctl2)){
return YES;
}
CGPoint ctr2 = [view1 convertPoint:poly2[1] fromView:nil];
if (CGRectContainsPoint(view1.bounds, ctr2)){
return YES;
}
CGPoint cbr2 = [view1 convertPoint:poly2[2] fromView:nil];
if (CGRectContainsPoint(view1.bounds, cbr2)){
return YES;
}
CGPoint cbl2 = [view1 convertPoint:poly2[3] fromView:nil];
if (CGRectContainsPoint(view1.bounds, cbl2)){
return YES;
}
CGPoint ctl1 = [view2 convertPoint:poly1[0] fromView:nil];
if (CGRectContainsPoint(view2.bounds, ctl1)){
return YES;
}
CGPoint ctr1 = [view2 convertPoint:poly1[1] fromView:nil];
if (CGRectContainsPoint(view2.bounds, ctr1)){
return YES;
}
CGPoint cbr1 = [view2 convertPoint:poly1[2] fromView:nil];
if (CGRectContainsPoint(view2.bounds, cbr1)){
return YES;
}
CGPoint cbl1 = [view2 convertPoint:poly1[3] fromView:nil];
if (CGRectContainsPoint(view2.bounds, cbl1)){
return YES;
}
return NO;
}

有人有想法吗?

关于ios - 随机放置的 UILabel 旋转后尺寸错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38989888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com