Bir UIView'de yatay bir çizgi çizmem gerekiyor. Bunu yapmanın en kolay yolu nedir? Örneğin, y-coord = 200'de siyah bir yatay çizgi çizmek istiyorum.
Interface Builder'ı KULLANMIYORUM.
Bir UIView'de yatay bir çizgi çizmem gerekiyor. Bunu yapmanın en kolay yolu nedir? Örneğin, y-coord = 200'de siyah bir yatay çizgi çizmek istiyorum.
Interface Builder'ı KULLANMIYORUM.
Yanıtlar:
Sizin durumunuzda (yatay çizgi) en kolay yol, siyah arka plan rengi ve çerçevesi olan bir alt görünüm eklemektir [0, 200, 320, 1]
.
Kod örneği (umarım hata yoktur - Xcode olmadan yazdım):
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[self.view addSubview:lineView];
[lineView release];
// You might also keep a reference to this view
// if you are about to change its coordinates.
// Just create a member and a property for this...
Başka bir yol da drawRect yönteminde bir çizgi çizecek bir sınıf oluşturmaktır (bunun için kod örneğimi burada görebilirsiniz ).
Belki biraz geç ama daha iyi bir yol olduğunu da eklemek istiyorum. UIView kullanmak basittir, ancak nispeten yavaştır. Bu yöntem, görünümün kendini nasıl çizdiğini geçersiz kılar ve daha hızlıdır:
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0f);
CGContextMoveToPoint(context, 0.0f, 0.0f); //start at this point
CGContextAddLineToPoint(context, 20.0f, 20.0f); //draw to this point
// and now draw the Path!
CGContextStrokePath(context);
}
CGContextBeginPath(context);
önce aramana gerek yok CGContextMoveToPoint(...);
mu?
Görüşünüzün sonunda gri bir çizgi nasıl çizebilirsiniz (b123400'ün cevabı ile aynı fikir)
class CustomView: UIView {
override func draw(_ rect: CGRect) {
super.draw(rect)
if let context = UIGraphicsGetCurrentContext() {
context.setStrokeColor(UIColor.gray.cgColor)
context.setLineWidth(1)
context.move(to: CGPoint(x: 0, y: bounds.height))
context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
context.strokePath()
}
}
}
Bunun için UIBezierPath Sınıfını kullanabilirsiniz:
Ve istediğiniz kadar çizgi çizebilirsiniz:
UIView alt sınıfına girdim:
@interface MyLineDrawingView()
{
NSMutableArray *pathArray;
NSMutableDictionary *dict_path;
CGPoint startPoint, endPoint;
}
@property (nonatomic,retain) UIBezierPath *myPath;
@end
Ve çizgi çizme için kullanılacak pathArray ve dictPAth nesnelerini başlattı. Kodun ana bölümünü kendi projemden yazıyorum:
- (void)drawRect:(CGRect)rect
{
for(NSDictionary *_pathDict in pathArray)
{
[((UIColor *)[_pathDict valueForKey:@"color"]) setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
[[_pathDict valueForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}
[[dict_path objectForKey:@"color"] setStroke]; // this method will choose the color from the receiver color object (in this case this object is :strokeColor)
[[dict_path objectForKey:@"path"] strokeWithBlendMode:kCGBlendModeNormal alpha:1.0];
}
touchesBegin yöntemi:
UITouch *touch = [touches anyObject];
startPoint = [touch locationInView:self];
myPath=[[UIBezierPath alloc]init];
myPath.lineWidth = currentSliderValue*2;
dict_path = [[NSMutableDictionary alloc] init];
touchesMoved Yöntemi:
UITouch *touch = [touches anyObject];
endPoint = [touch locationInView:self];
[myPath removeAllPoints];
[dict_path removeAllObjects];// remove prev object in dict (this dict is used for current drawing, All past drawings are managed by pathArry)
// actual drawing
[myPath moveToPoint:startPoint];
[myPath addLineToPoint:endPoint];
[dict_path setValue:myPath forKey:@"path"];
[dict_path setValue:strokeColor forKey:@"color"];
// NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
// [pathArray addObject:tempDict];
// [dict_path removeAllObjects];
[self setNeedsDisplay];
touchesEnded Yöntemi:
NSDictionary *tempDict = [NSDictionary dictionaryWithDictionary:dict_path];
[pathArray addObject:tempDict];
[dict_path removeAllObjects];
[self setNeedsDisplay];
Guy Daher'in cevabına göre.
Kullanmaktan kaçınmaya mı çalışıyorum? çünkü GetCurrentContext () nil değerini döndürürse uygulamanın çökmesine neden olabilir.
İfadeyi kontrol etmezdim:
class CustomView: UIView
{
override func draw(_ rect: CGRect)
{
super.draw(rect)
if let context = UIGraphicsGetCurrentContext()
{
context.setStrokeColor(UIColor.gray.cgColor)
context.setLineWidth(1)
context.move(to: CGPoint(x: 0, y: bounds.height))
context.addLine(to: CGPoint(x: bounds.width, y: bounds.height))
context.strokePath()
}
}
}
if
cümlenin nedeni yalnızca isteğe bağlı olanın kutusunu kaldırmaksa, guard
bunun yerine bir ifade kullanmayı tercih edin .