#iphone #ios #uibutton
#iPhone #iOS #uibutton
Вопрос:
Как мне подключиться к двум мобильным (перетаскиваемым) UIButtons с помощью строки?
Проблема: когда я подключаюсь, это выглядит довольно хорошо, но когда я пытаюсь перетащить одну кнопку, строка остается в том же положении.
Я хочу сделать что-то вроде Discover Music или Discover Apps, чтобы построить мобильный график с UIButtons в качестве узлов.
Вот пример моего кода:
- (CGRect)currentRect {
return CGRectMake (firstTouch.x,
firstTouch.y,
lastTouch.x - firstTouch.x,
lastTouch.y - firstTouch.y);
}
- (void)drawRect:(CGRect)rect {
self.currentColor = [UIColor redColor];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
CGContextSetFillColorWithColor(context, currentColor.CGColor);
CGContextMoveToPoint(context, firstTouch.x, firstTouch.y);
CGContextAddLineToPoint(context, lastTouch.x, lastTouch.y);
CGContextStrokePath(context);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
firstTouch = [touch locationInView:self];
lastTouch = [touch locationInView:self];
[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
lastTouch = [touch locationInView:self];
redrawRect = CGRectUnion(redrawRect, self.currentRect);
redrawRect = CGRectInset(redrawRect, -2.0, -2.0);
[self setNeedsDisplayInRect:redrawRect];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
lastTouch = [touch locationInView:self];
redrawRect = CGRectUnion(redrawRect, self.currentRect);
[self setNeedsDisplayInRect:redrawRect];
}
Комментарии:
1. если вы обнаружите перемещение этих кнопок, все смежные ребра / линии также должны быть изменены. Что вы имеете в виду, говоря «когда я подключаю его [строка с помощью UIButton]»?
2. Правильно =) Я думал так же, но есть проблема. Когда я это сделал, появляется новая строка, но я не могу удалить предыдущую. Таким образом, в результате есть 2 строки, и одна строка была между UIButton, которая не перемещалась, и пустым пространством.
3. хорошо, тогда было бы неплохо посмотреть некоторый код
4. Теперь вы можете видеть код. Когда я пытаюсь нарисовать новую строку, предыдущая не исчезает.
5. Вы пробовали просто использовать setneedsdisplay без rect? Возможно, поскольку вы даете ему прямоугольник, он просто перерисовывает эту часть экрана, и поэтому старая строка, которой там может не быть, не перерисовывается
Ответ №1:
сначала вы должны очистить контекст. попробуйте:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]);
CGContextFillRect(context, self.bounds);
self.currentColor = [UIColor redColor];
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
//...
Я не тестировал код, но он должен помочь
Комментарии:
1. Спасибо! Выглядит хорошо, но я сам нашел решение: в реализации добавьте цвет фона, и все работает нормально. Забавно =)