Bạn đang tìm kiếm xung quanh và cố gắng thay đổi màu viền (với màu văn bản khác) mà không có may mắn. Có thể thay đổi màu, nhưng thay đổi cả văn bản và đường viền.iphone ios7 phân đoạn UISegmentedControl chỉ thay đổi màu đường viền
Trả lời
Bạn có thể sử dụng proxy UIAppearance để đặt thuộc tính văn bản tiêu đề nhưng giữ tintColor cho đường viền. Cái gì như:
[[UISegmentedControl appearance] setTitleTextAttributes:@{
NSForegroundColorAttributeName : [UIColor redColor]
} forState:UIControlStateNormal];
Edit:
Để tint hình ảnh, bạn có thể sử dụng một cái gì đó như thế này trong thể loại trên UImage:
- (instancetype)tintedImageWithColor:(UIColor *)tintColor {
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = (CGRect){ CGPointZero, self.size };
CGContextSetBlendMode(context, kCGBlendModeNormal);
[self drawInRect:rect];
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Giải pháp của tôi đưa ra biên giới của phân đoạn kiểm soát một màu khác, và giữ văn bản như màu sắc.
Để chỉ thay đổi màu đường viền của điều khiển được phân đoạn của bạn, hãy đặt một điều khiển phân đoạn khác trên điều khiển cũ của bạn. Sau đó vô hiệu hóa tương tác của người dùng cho cái mới này và tôi đặt hình ảnh cho phân đoạn đã chọn thành không.
UISegmentedControl *segCtrl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Segm 1", @"Segm 2", @"Segm 3", @"Segm 4", nil]];
// The UISegmentedController which you want to change the border color for
[segCtrl setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[segCtrl setSelectedSegmentIndex:0];
[segCtrl setTintColor:[UIColor redColor]];
UISegmentedControl *bcg = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@" ", @" ", @" ", @" ", nil]];
// The UISegmentedController you put on top of the other one
[bcg setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[bcg setSelectedSegmentIndex:0];
[bcg setImage:nil forSegmentAtIndex:0]; // Removing highlight color
[bcg setTintColor:[UIColor greenColor]];
[bcg setUserInteractionEnabled:NO];
[[self view] addSubview:segCtrl];
[[self view] addSubview:bcg];
Tất nhiên, bạn phải chăm sóc của khung và tô màu để phù hợp với ứng dụng của bạn. Ngoài ra, mã này nên là tốt để đi.
a) nó sai, xem câu trả lời khác đó là đơn giản hơn và đơn giản b) bạn đang dùng giả hoang dã về cách điều khiển trông giống như với các tính toán cố định. Một thay đổi nhỏ đối với iOS và bạn sẽ phải cập nhật mã của mình. c) bạn không che phủ hai điều khiển trừ khi được yêu cầu hoàn toàn. – dwery
Tôi thích giải pháp khác nhau (không loại), khi bạn thiết lập hình ảnh cho UISegmentedControl
hơn bạn phải thay đổi hình ảnh như thế:
NSArray *items = nil;
if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
items = @[
[[UIImage imageNamed:@"Images_Icon_Notes.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Keywords.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Actionitems.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal],
[[UIImage imageNamed:@"Images_Icon_Questions.png"] imageWithRenderingMode: UIImageRenderingModeAlwaysOriginal]
];
} else {
items = @[
[UIImage imageNamed:@"Images_Icon_Notes.png"],
[UIImage imageNamed:@"Images_Icon_Keywords.png"],
[UIImage imageNamed:@"Images_Icon_Actionitems.png"],
[UIImage imageNamed:@"Images_Icon_Questions.png"]
];
}
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items];
segmentedControl.tintColor = [UIColor greenColor]; // desired color of border
Bây giờ tintColor
sẽ có tác động chỉ trên biên giới không phải trên biểu tượng.
if
cung cấp khả năng tương thích với các phiên bản iOS cũ hơn.
Tôi phải nói điều này imageWithRenderingMode:
là một trong những API WTF lớn nhất mà tôi từng thấy.
Câu hỏi ban đầu không phải là về hình ảnh nhuộm màu. – kkodev
"chỉ thay đổi màu đường viền" bằng 'tintColor'. Nhưng điều này có tác động trên các biểu tượng theo mặc định, và điều này ngăn chặn vấn đề này. Tôi đã giả định rằng điều này là hiển nhiên, dường như tôi đã sai nên tôi đã cập nhật. Câu trả lời được chấp nhận giải quyết cùng một vấn đề bằng cách sử dụng danh mục làm giải pháp thay thế. Cách tiếp cận của tôi tốt hơn nhiều. –
Ups bây giờ tôi đã nhận thấy rằng bạn đe dọa các biểu tượng khác nhau sau đó tôi đã mong đợi. Vẫn IMO câu trả lời của tôi là khá hữu ích. –
for (int i=0; i<[mySegmentedControl.subviews count]; i++)
{
if ([[mySegmentedControl.subviews objectAtIndex:i]isSelected])
{
[[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor blueColor]];
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]];
}
else
{
[[mySegmentedControl.subviews objectAtIndex:i] setBackgroundColor:[UIColor whiteColor]];
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor clearColor]];
}
}
Điều gì làm việc cho tôi: như các câu trả lời khác được đề xuất, thay đổi màu sắc của phân đoạnĐiều khiển thành clearColor. Và tự tay tô màu hình ảnh cho màu ứng dụng của bạn.
Hãy nhớ sử dụng imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal
vào hình ảnh màu
-(UIImage *)tintedImage:(UIImage *)image withColor:(UIColor *)tintColor
{
UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect rect = (CGRect){ CGPointZero, image.size };
CGContextSetBlendMode(context, kCGBlendModeNormal);
[image drawInRect:rect];
CGContextSetBlendMode(context, kCGBlendModeSourceIn);
[tintColor setFill];
CGContextFillRect(context, rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return [newImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}
Bạn có thể thay đổi đầu tiên tintColor và sau khi titleText.
//Changes Tint Color
segmentedControlName.tintColor = [UIColor colorWithRed:0/255 green:0/255 blue:0/255 alpha:1];
//TitleText to BlackColor
[[UISegmentedControl appearance] setTitleTextAttributes:@{ NSForegroundColorAttributeName : [UIColor blackColor] } forState:UIControlStateNormal];
Rất tốt. Câu trả lời nhanh, chính xác. Xin mọi người, Thêm câu trả lời này. – ort11
Tôi sẽ nói câu trả lời của tôi ở đây là một giải pháp chính xác hơn. Vui lòng xem :) – OscarWyck
+ 1 cho mã, đã lưu cho tôi rất nhiều nhức đầu – Pramesh